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 subqueries. O Atlas Search fornece um modelo de query composta de amostra com orientação. Para saber mais, consulte Modelo de orientação de query de visualizaçã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. | ||||||||||||||
score | Modifique a pontuação de toda a cláusula compound . Você pode usar score para impulsionar, substituir ou alterar a pontuação. Se você não especificar score , a pontuação retornada será a soma das pontuações de todas as subqueries nas cláusulas must e should que tiveram correspondência. Para saber mais, consulte Comportamento de pontuação. |
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.
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 |
---|---|---|
filter | ||
must | ||
mustNot | ||
should |
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 collection fruit
tem um índice padrão com mapeamentos dinâmicos que indexa automaticamente todos os campos na collection e usa o analyzer padrão . O analyzer standard
coloca todas as palavras em letras minúsculas e desconsidera as palavras de parada comuns ("the", "a", "and",
etc.).
Exemplos de queries
As seguintes queries demonstram o operador $search
compound
nas queries do Atlas Search.
must
e mustNot
Exemplo
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 should
Exemplo
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 ])
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 ])
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 ])
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 ])
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 $match
por $in
em suas queries em relação aos dados do Atlas 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 usa should
para especificar a preferência para documentos que contenham o termo varieties
. A query 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 ])
Os documentos no resultado cumprem todos os requisitos para inclusão:
Ambos os documentos contêm o termo
apples
oubananas
que foi especificado na cláusulafilter
da query.O documento com
_id: 1
pontuações mais altas do que o 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 ])
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.