Realçar termos de pesquisa nos resultados
Nesta página
A opção Atlas Search highlight
adiciona campos ao conjunto de resultados que exibem os termos de pesquisa em seu contexto original. Você pode usá-lo em conjunto com todos os operadores $search para exibir os termos de pesquisa conforme eles aparecem nos documentos retornados, junto com o conteúdo de texto adjacente (se houver). Os resultados de highlight
são retornados como parte do campo $meta
.
Sintaxe
highlight
tem a seguinte sintaxe:
{ $search: { "index": "<index name>", // optional, defaults to "default" "<operator>": { // such as "text", "compound", or "phrase" <operator-specification> }, "highlight": { "path": "<field-to-search>", "maxCharsToExamine": "<number-of-chars-to-examine>", // optional, defaults to 500,000 "maxNumPassages": "<number-of-passages>" // optional, defaults to 5 } } }, { $project: { "highlights": { "$meta": "searchHighlights" } } }
Opções
Campo | Tipo | Descrição | Obrigatório? |
---|---|---|---|
path | string | Campo de documento a ser pesquisado. O campo
Para mais informações, consulte Construir um caminho de query. | sim |
maxCharsToExamine | int | Número máximo de caracteres a serem examinados em um documento quando se está realçando um campo. Se omitido, o padrão é 500,000 , o que significa que o Atlas Search examina apenas os primeiros 500.000 caracteres no campo de pesquisa em cada documento para realce. | Não |
maxNumPassages | int | Número de passagens de alta pontuação para retornar por documento nos resultados highlights de cada campo. Uma passagem tem aproximadamente o comprimento de uma frase. Se omitido, o padrão é 5, o que significa que, para cada documento, o Atlas Search retorna as 5 passagens de maior pontuação que correspondem ao texto de pesquisa. | Não |
O campo "$meta": "searchHighlights"
contém os resultados realçados. Esse campo não faz parte do documento original, então é necessário usar um estágio de pipeline$project para adicioná-lo à saída da consulta.
Saída
O campo highlights
é uma array contendo os seguintes campos de saída:
Campo | Tipo | Descrição |
---|---|---|
path | string | Campo de documento que retornou uma correspondência. |
texts | matriz de documentos | Cada correspondência de pesquisa retorna um ou mais objetos, contendo o texto correspondente e o texto do entorno (se houver). |
texts.value | string | Texto do campo que retornou uma correspondência. |
texts.type | string | Tipo de resultado. O valor pode ser um dos seguintes:
|
score | flutuar | Pontuação atribuída ao resultado correspondente. A pontuação highlights é uma medida da relevância do objeto highlights para a consulta. Se vários objetos highlights forem retornados, o objeto highlights mais relevante terá a pontuação mais alta. |
Pré-requisitos
Você deve indexar o campo que deseja realçar como um tipo de string do Atlas Search com indexOptions
configurado como offsets
(padrão).
Limitações
Você não pode utilizar a opção highlight
do Atlas Search em conjunto com o operador embeddedDocument.
Exemplos
Você pode tentar os seguintes exemplos no Atlas Search Playground ou no seu Atlas cluster.
Coleção de amostras
Os exemplos nesta página usam uma collection chamada fruit
que contém os seguintes documentos:
{ "_id" : 1, "type" : "fruit", "summary" : "Apple varieties", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.", "category": "organic" }, { "_id" : 2, "type" : "fruit", "summary" : "Banana", "description" : "Bananas are usually sold in bunches of five or six.", "category": "nonorganic" }, { "_id" : 3, "type" : "fruit", "summary" : "Pear varieties", "description" : "Bosc and Bartlett are the most common varieties of pears.", "category": "nonorganic" }
Índice de amostra
A coleção fruit
também tem uma definição de índice que utiliza o analisador inglês e mapeamentos de campo dinâmicos.
{ "analyzer": "lucene.english", "searchAnalyzer": "lucene.english", "mappings": { "dynamic": true } }
Observação
Um aspecto útil do realce é que ele revela o texto original que a query de pesquisa retornou, que pode não ser exatamente igual ao termo pesquisado. Por exemplo, se você usar um analisador específico de idioma, suas pesquisas de texto retornarão todos os derivados variações dos termos de pesquisa.
Outro aspecto útil do realce é que ele pode ser utilizado para realçar qualquer campo, dentro ou fora da query path
. Por exemplo, ao pesquisar um termo, você pode executar o realce para o termo da query no campo da query e em quaisquer outros campos especificados usando a opção highlight
. Para saber mais, consulte Exemplo de vários campos.
Exemplos de queries
As seguintes queries demonstram a opção $search
highlight
nas queries do Atlas Search.
Exemplo básico
A seguinte query pesquisa variety
e bunch
no campo description
da collection fruit
com a opção highlight
habilitada.
O estágio do pipeline $project restringe a saída ao campo description
e adiciona um novo campo chamado highlights
, que contém informações de destaque.
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "text": { 5 "path": "description", 6 "query": ["variety", "bunch"] 7 }, 8 "highlight": { 9 "path": "description" 10 } 11 } 12 }, 13 { 14 $project: { 15 "description": 1, 16 "_id": 0, 17 "highlights": { "$meta": "searchHighlights" } 18 } 19 } 20 ])
O termo de pesquisa bunch
retorna uma correspondência no documento com _id: 2
, pois o campo description
contém a palavra bunches
. O termo de pesquisa variety
retorna uma correspondência nos documentos com _id: 3
e _id: 1
, pois o campo description
contém a palavra varieties
.
➤ Tente fazer isso no Atlas Search Playground.
Exemplo avançado
A seguinte consulta pesquisa por variety
e bunch
no campo description
da coleção fruit
, com a opção highlight
habilitada, número máximo de caracteres a ser examinado definido como 40
e somente 1
passagem de pontuação alta para retornar por documento.
O estágio do pipeline $project restringe a saída ao campo description
e adiciona um novo campo chamado highlights
, que contém informações de destaque.
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "text": { 5 "path": "description", 6 "query": ["variety", "bunch"] 7 }, 8 "highlight": { 9 "path": "description", 10 "maxNumPassages": 1, 11 "maxCharsToExamine": 40 12 } 13 } 14 }, 15 { 16 $project: { 17 "description": 1, 18 "_id": 0, 19 "highlights": { "$meta": "searchHighlights" } 20 } 21 } 22 ])
O segundo documento nos resultados acima contém um array highlights
vazio, embora o campo de pesquisa contenha o termo de pesquisa varieties
porque o Atlas Search examinou apenas 40
caracteres para realce. Da mesma forma, a palavra includ
é truncada porque o Atlas Search examinou apenas 40
caracteres no campo de pesquisa para realce. No terceiro documento, embora várias passagens contenham o termo de pesquisa, o Atlas Search retorna apenas uma passagem nos resultados dehighlights
porque a query exigia apenas 1
passagem por documento nos resultados de highlights
.
➤ Tente fazer isso no Atlas Search Playground.
Exemplo de vários campos
A query a seguir pesquisa varieties
no campo description
da collection fruit
, com a opção highlight
habilitada para os campos description
e summary
.
O estágio do pipeline $project adiciona um novo campo chamado highlights
, que contém informações de realce para o termo da query em todos os campos na opção highlight
.
1 db.fruit.aggregate([ 2 { 3 $search: { 4 "text": { 5 "path": "description", 6 "query": "varieties" 7 }, 8 "highlight": { 9 "path": ["description", "summary" ] 10 } 11 } 12 }, 13 { 14 $project: { 15 "description": 1, 16 "summary": 1, 17 "_id": 0, 18 "highlights": { "$meta": "searchHighlights" } 19 } 20 } 21 ])
O termo de pesquisa varieties
retorna uma correspondência em documentos com _id: 1
e _id: 3
porque o campo de consulta description
em ambos os documentos contém o termo de consulta varieties
. Além disso, a matriz highlights
inclui o campo summary
porque o campo contém o termo de consulta varieties
.
➤ Tente fazer isso no Atlas Search Playground.
Exemplo de curinga
A query abaixo pesquisa o termo varieties
em campos que começam com des
na collection fruit
, com a opção highlight
habilitada para campos que começam com des
.
O estágio do pipeline $project adiciona um novo campo chamado highlights
, que contém informações de realce.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": {"wildcard": "des*"}, 6 "query": ["variety"] 7 }, 8 "highlight": { 9 "path": {"wildcard": "des*"} 10 } 11 } 12 }, 13 { 14 "$project": { 15 "description": 1, 16 "_id": 0, 17 "highlights": { "$meta": "searchHighlights" } 18 } 19 } 20 ])
Nos resultados do Atlas Search, os campos que começam com des
ficam em realce.
➤ Tente fazer isso no Atlas Search Playground.
Exemplo composto
A seguinte consulta procura o termo organic
no campo category
e variety
no campo description
. A opção highlight
na consulta composta $search
solicita informações de realce apenas para a consulta de texto em relação ao campo description
. Observe que a opção highlight
dentro do estágio $search
deve ser filha do estágio $search
, e não de qualquer operador dentro do estágio $search
.
O estágio do pipeline $project adiciona um novo campo chamado highlights
, que contém informações de realce.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "should": [{ 6 "text": { 7 "path": "category", 8 "query": "organic" 9 } 10 }, 11 { 12 "text": { 13 "path": "description", 14 "query": "variety" 15 } 16 }] 17 }, 18 "highlight": { 19 "path": "description" 20 } 21 } 22 }, 23 { 24 "$project": { 25 "description": 1, 26 "category": 1, 27 "_id": 0, 28 "highlights": { "$meta": "searchHighlights" } 29 } 30 } 31 ])
➤ Tente fazer isso no Atlas Search Playground.
Exemplo de preenchimento automático
Neste exemplo, a collection fruit
também tem a seguinte definição de índice.
{ "mappings": { "dynamic": false, "fields": { "description": [ { "type": "autocomplete", "tokenization": "edgeGram", "minGrams": 2, "maxGrams": 15, "foldDiacritics": true } ] } } }
A seguinte query procura os caracteres var
no campo description
da collection fruit
, com a opção highlight
habilitada para o campo description
.
O estágio do pipeline $project adiciona um novo campo chamado highlights
, que contém informações de realce.
Importante
Para destacar a versão indexada do preenchimento automático de um caminho, o operador de preenchimento automático deve ser o único operador que usa esse caminho na query.
1 db.fruit.aggregate([ 2 { 3 "$search": { 4 "autocomplete": { 5 "path": "description", 6 "query": ["var"] 7 }, 8 "highlight": { 9 "path": "description" 10 } 11 } 12 }, 13 { 14 "$project": { 15 "description": 1, 16 "_id": 0, 17 "highlights": { "$meta": "searchHighlights" } 18 } 19 } 20 ])
O Atlas Search retorna uma correspondência nos documentos com _id: 1
e id_: 2
para a string da query var
porque o campo description
na collection fruit
contém os caracteres var
no início de uma palavra. O Atlas Search corresponde um realce hit
mais grosseiro para os termos da query quando um caminho realçado é referenciado apenas nos operadores com preenchimento automático da query realçada.
➤ Tente fazer isso no Atlas Search Playground.