composto
Definição
compound
O operador
compound
combina dois ou mais operadores em uma única query. Cada elemento de uma querycompound
é chamado de cláusula e cada cláusula consiste em uma ou mais subquery. O Atlas Search fornece um modelo de query composto de amostra com orientação. Para saber mais, consulte Exibir modelo de orientação de query.
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 sempontuação como igual, faixa e na cláusula para evitar operações filter
de pontuação desnecessárias. Se você quiser executar várias operações que devem ser avaliadas como uma OR
condição, aninhe uma cláusula dentro do de should
nível filter
superior.
Exemplo
[ { $search: { index: "default", compound: { filter: [ { compound: { should: [ { equals: { path: "accommodates", value: 2 } }, { range: { path: "pricePerNight", lte: 200 } } ] } } ] } } } ]
Comportamento de pontuação
O Atlas 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 | Não 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 seguintes exemplos no Atlas Search Playground ou no seu cluster do Atlas.
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 queries a seguir demonstram o operador $search
compound
nas queries do Atlas 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
.
➤ Experimente isso no Atlas Search Playground.
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
.
➤ Experimente isso no Atlas Search Playground.
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
.
➤ Experimente isso no Atlas Search Playground.
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
.
➤ Experimente isso no Atlas Search Playground.
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:
must
efilter
para especificar as condições de pesquisa que devem ser atendidas.should
para especificar a preferência para documentos que contenham a palavrabanana
. A cláusulashould
nã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
must
como a cláusulafilter
correspondem.O valor
minimumShouldMatch
não é especificado, portanto o seu padrão é0
. Como resultado, a cláusulashould
falha e ainda retorna um documento.
➤ Experimente isso no Atlas Search Playground.
Você pode substituir o $match
por $in
em suas consultas contra dados em seu cluster do Atlas com a cláusula filter
. A consulta a seguir demonstra como usar filter
no estágio $search
para especificar os termos de pesquisa que devem corresponder. A consulta também usa should
para especificar a preferência para documentos que contenham o termo varieties
. A consulta inclui o estágio de pipeline $project
para fazer o seguinte:
Excluir todos os campos, exceto
_id
edescription
.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
apples
oubananas
que foi especificado na seçãofilter
da query.Um documento com
_id: 1
tem uma pontuação maior que um documento com_id: 2
porque contém o termovarieties
especificado na cláusulashould
da query.
➤ Experimente isso no Atlas Search Playground.
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
apple
no campotype
.Contém o termo
organic
no campocategory
e o valortrue
no 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: 3
corresponde à cláusulamust
aninhada dentro da segunda cláusulashould
.O documento com
_id: 1
corresponde à primeira cláusulashould
.
➤ Experimente isso no Atlas Search Playground.