Definição
Sintaxe
compound tem a seguinte sintaxe:
1 { 2 $search: { 3 "index": <index name>, // optional, defaults to "default" 4 "compound": { 5 <must | mustNot | should | filter>: [ { <clauses> } ], 6 "score": <options> 7 } 8 } 9 }
Cada cláusula must, mustNot, should e filter contém uma array de cláusulas secundárias. Use sintaxe de array mesmo se a array contiver apenas uma cláusula secundária. Consulte os exemplos nesta página.
Opções
compound usa os seguintes termos para construir uma consulta:
As cláusulas que devem corresponder a um documento a ser incluído nos resultados. A pontuação retornada é a soma das pontuações de todas as subqueries na cláusula. Mapeia para o operador booleano | ||||||||||||||
As cláusulas que não devem corresponder para que um documento seja incluído nos resultados. As cláusulas Mapeia para o operador booleano | ||||||||||||||
Cláusulas que você prefere corresponder em documentos incluídos nos resultados. Documentos que contêm uma correspondência com uma cláusula Se você usar mais de uma cláusula Veja um exemplo .. Mapeia para o operador booleano Se você usar apenas o termo | ||||||||||||||
As cláusulas que devem corresponder para que um documento seja incluído nos resultados. Cláusulas Por exemplo, você pode substituir o estágio Você pode usar a opção Veja outro exemplo de filtro . | ||||||||||||||
| Modifique a pontuação de toda a |
Uso
Você pode usar qualquer uma das cláusulas com qualquer operador de nível superior, como preenchimento automático, texto ou span, para especificar critérios de query.
Para otimizar o desempenho, coloque operadores que não pontuam, como igual, faixa e em, no termo filter para evitar operações de pontuação desnecessárias. Se você quiser executar várias operações que devem ser avaliadas como uma condição OR, aninhe um termo should dentro do nível superior filter.
Exemplo
[ { $search: { index: "default", compound: { filter: [ { compound: { should: [ { equals: { path: "accommodates", value: 2 } }, { range: { path: "pricePerNight", lte: 200 } } ] } } ] } } } ]
Comportamento de pontuação
O MongoDB Search classifica documentos no conjunto de resultados somando a pontuação que o documento recebeu para cada cláusula individual que gerou uma correspondência no documento. Somente os termos must e should participam da pontuação. O conjunto de resultados é ordenado por pontuação, da mais alta para a mais baixa.
A tabela seguinte mostra as cláusulas compound que contribuem e não contribuem para a pontuação.
Termo | Contribui para a pontuação |
|---|---|
| |
| |
| |
|
Você pode impulsionar ou substituir a pontuação de toda a query composta utilizando a opção score. Para obter um exemplo de substituição de toda a pontuação composta, consulte Exemplo de Pontuação Composta abaixo. Você também pode usar a pontuação para aumentar ou alterar a pontuação de cada subquery em cada cláusula. Para ver alguns exemplos de pontuações alteradas nas cláusulas do operador compound, consulte Modificar a Pontuação.
Exemplos
Você pode tentar os exemplos a seguir no MongoDB Search Playground ou em seu cluster.
Collection de amostras
Os exemplos nesta página usam uma coleção chamada fruit, que contém os seguintes documentos:
1 { 2 "_id" : 1, 3 "type" : "apple", 4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 5 "category" : "nonorganic", 6 "in_stock" : false 7 }, 8 { 9 "_id" : 2, 10 "type" : "banana", 11 "description" : "Bananas are usually sold in bunches of five or six.", 12 "category" : "nonorganic", 13 "in_stock" : true 14 }, 15 { 16 "_id" : 3, 17 "type" : "pear", 18 "description" : "Bosc and Bartlett are the most common varieties of pears.", 19 "category" : "organic", 20 "in_stock" : true 21 }
Índice de amostra
A coleção fruit tem um índice padrão com mapeamentos dinâmicos que indexa automaticamente todos os campos na coleção e usa o analisador padrão . O analisador standard coloca todas as palavras em letras minúsculas e desconsidera palavras vazias comuns ("the", "a", "and", etc).
Exemplos de queries
As seguintes queries demonstram o operador $search compound nas queries do MongoDB Search.
must e Exemplo mustNot
O exemplo a seguir usa uma combinação das cláusulas must e mustNot para criar uma query. A cláusula must usa o operador de texto para procurar o termo varieties no campo description . Para que um documento corresponda, ele deve atender à cláusula must . A cláusula mustNot executa uma operação de pesquisa para o termo apples no campo description . Para que um documento corresponda, ele não deve atender à cláusula mustNot .
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "mustNot": [{ 12 "text": { 13 "query": "apples", 14 "path": "description" 15 } 16 }] 17 } 18 } 19 } 20 ])
A query acima retorna o documento com _id: 3 porque seu campo description contém a palavra varieties e não contém apples.
➤ Tente fazer isso no playground do MongoDB Search.
must e Exemplo should
As queries a seguir usam must para query as condições de procurar que devem ser atendidas e should para especificar a preferência para documentos que contêm a palavra Fuji.
Para essa query, o estágio do pipeline $project exclui todos os campos do documento, exceto _id, e adiciona um campo score, que exibe a pontuação de relevância do documento.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "Fuji", 14 "path": "description" 15 } 16 }] 17 } 18 } 19 }, 20 { 21 "$project": { 22 "score": { "$meta": "searchScore" } 23 } 24 } 25 ])
{ "_id" : 1, "score" : 0.6425117254257202 } { "_id" : 3, "score" : 0.21649497747421265 }
O documento com _id: 1 tem uma pontuação maior porque seu campo description contém a palavra Fuji, satisfazendo a cláusula should.
➤ Tente fazer isso no playground do MongoDB Search.
A query a seguir também especifica uma pontuação constant de 3 para todos os documentos nos resultados. Para essa query, o estágio do pipeline $project exclui todos os campos do documento, exceto _id, e adiciona um campo score .
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "Fuji", 14 "path": "description" 15 } 16 }], 17 "score": { "constant": { "value": 3 } } 18 } 19 } 20 }, 21 { 22 "$project": { 23 "score": { "$meta": "searchScore" } 24 } 25 } 26 ])
[ { _id: 1, score: 3 }, { _id: 3, score: 3 } ]
Ambos os documentos recebem a mesma pontuação porque a opção constant na query substitui a pontuação de cada documento no resultado pelo número 3.
➤ Tente fazer isso no playground do MongoDB Search.
exemplo MinimumShouldMatch
Em uma query com múltiplas cláusulas do should, você pode utilizar a opção miniumumShouldMatch para especificar um número mínimo de cláusulas que deve corresponder para retornar um resultado.
A seguinte query tem uma cláusula must e duas cláusulas should, com um valor minimumShouldMatch de 1. Um documento deve incluir o termo varieties no campo description e deve incluir Fuji ou Golden Delicious no campo de descrição para ser incluído no conjunto de resultados.
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "Fuji", 14 "path": "description" 15 } 16 }, 17 { 18 "text": { 19 "query": "Golden Delicious", 20 "path": "description" 21 } 22 }], 23 "minimumShouldMatch": 1 24 } 25 } 26 } 27 ])
1 { 2 "_id" : 1, 3 "type" : "apple", 4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 5 "category" : "nonorganic", 6 "in_stock" : false 7 }
O documento com _id: 1 corresponde à cláusula must e à primeira das duas cláusulas should.
➤ Tente fazer isso no playground do MongoDB Search.
filter Exemplos
filter comporta-se da mesma forma que must, exceto pelo fato de que a cláusula filter não é considerada na pontuação de um documento retornado e, portanto, não afeta a ordem dos documentos retornados.
A seguinte consulta utiliza as seguintes cláusulas:
mustefilterpara especificar as condições de pesquisa que devem ser atendidas.shouldpara especificar a preferência para documentos que contenham a palavrabanana. A cláusulashouldnão inclui a opçãominimumShouldMatch. Quando você omiteminimumShouldMatch, o padrão é0.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "query": "varieties", 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "banana", 14 "path": "description" 15 } 16 }], 17 "filter": [{ 18 "text": { 19 "query": "granny", 20 "path": "description" 21 } 22 }] 23 } 24 } 25 } 26 ])
1 { 2 "_id" : 1, 3 "type" : "apple", 4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 5 "category" : "nonorganic", 6 "in_stock" : false 7 }
O documento retornado cumpre todos os requisitos para inclusão:
Tanto a cláusula
mustcomo a cláusulafiltercorrespondem.O valor
minimumShouldMatchnão é especificado, portanto o seu padrão é0. Como resultado, a cláusulashouldfalha e ainda retorna um documento.
➤ Tente fazer isso no playground do MongoDB Search.
Você pode substituir o $match por $in em suas queries em relação aos dados em seu cluster com a cláusula filter. A seguinte query demonstra como utilizar filter no estágio $search para especificar os termos de pesquisa que devem corresponder. A query também utiliza should para especificar a preferência para documentos que contêm o termo varieties. A query inclui o estágio de pipeline $project para fazer o seguinte:
Excluir todos os campos, exceto
_idedescription.Adicione um campo
score, que exibe a pontuação de relevância do documento.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "filter": [{ 6 "text": { 7 "query": ["apples", "bananas"], 8 "path": "description" 9 } 10 }], 11 "should": [{ 12 "text": { 13 "query": "varieties", 14 "path": "description" 15 } 16 }] 17 } 18 } 19 }, 20 { 21 "$project": { 22 "description": 1, 23 "score": { "$meta": "searchScore" } 24 } 25 } 26 ])
1 [ 2 { 3 _id: 1, 4 description: 'Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.', 5 score: 0.36074575781822205 6 }, 7 { 8 _id: 2, 9 description: 'Bananas are usually sold in bunches of five or six.', 10 score: 0 11 } 12 ]
Os documentos no resultado atendem a todos os requisitos para inclusão:
Ambos os documentos contêm o termo
applesoubananasque foi especificado na seçãofilterda query.Um documento com
_id: 1tem uma pontuação maior que um documento com_id: 2porque contém o termovarietiesespecificado na cláusulashouldda query.
➤ Tente fazer isso no playground do MongoDB Search.
Exemplo aninhado
O exemplo seguinte utiliza cláusulas compound aninhadas para construir uma query. Neste exemplo, a collection fruit tem um índice nos campos type, category e in_stock, cujos campos de texto usam o analyzer padrão. A query exige que os documentos satisfaçam apenas uma das seguintes cláusulas should:
Contenha a palavra
appleno campotype.Contém o termo
organicno campocategorye o valortrueno campoin_stock.
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "compound": { 5 "should": [ 6 { 7 "text": { 8 "query": "apple", 9 "path": "type" 10 } 11 }, 12 { 13 "compound": { 14 "must": [ 15 { 16 "text": { 17 "query": "organic", 18 "path": "category" 19 } 20 }, 21 { 22 "equals": { 23 "value": true, 24 "path": "in_stock" 25 } 26 } 27 ] 28 } 29 } 30 ], 31 "minimumShouldMatch": 1 32 } 33 } 34 } 35 ])
1 { 2 "_id" : 3, 3 "type" : "pear", 4 "description" : "Bosc and Bartlett are the most common varieties of pears.", 5 "category" : "organic", 6 "in_stock" : true 7 } 8 { 9 "_id" : 1, 10 "type" : "apple", 11 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", 12 "category" : "nonorganic", 13 "in_stock" : false 14 }
Os documentos dos resultados atendem a todos os requisitos de inclusão:
O documento com
_id: 3corresponde à cláusulamustaninhada dentro da segunda cláusulashould.O documento com
_id: 1corresponde à primeira cláusulashould.
➤ Tente fazer isso no playground do MongoDB Search.
Exemplos de metadados
As consultas a seguir recuperam metadados para retornar o número de categorias na coleção fruit usando o estágio de pipeline $searchMeta ou a variável $$SEARCHMETA do estágio $search.