The relationship between search queries and search indexes dictates how efficiently and effectively you can find data within your MongoDB collections using MongoDB Search.
MongoDB Search queries specify the criteria for finding documents within a database. MongoDB Search queries take the form of an aggregation pipeline that begins with the $search
or $searchMeta
pipeline stage. You can use operators, collectors, and search options inside the pipeline stages to implement complex search functionality like full-text search, relevance-based ranking, faceted search, filtering, and sorting.
Before you can run an MongoDB Search query, you must create an MongoDB Search index on the fields that you want to search. Search indexes are data structures that are optimized to quickly retrieve documents that meet the search criteria of your query. When you define a search index, you specify which fields to index and how these fields should be tokenized.
Queries de pesquisa eficazes dependem de índices de pesquisa bem definidos. Os campos que você pretende pesquisar devem ser indexados, e a configuração do índice determina se sua pesquisa oferece suporte a ordenação, facetas, preenchimento automático e outras funcionalidades de pesquisa. Você pode iterar tanto no design da query quanto no design do índice para equilibrar a precisão da pesquisa com o desempenho.
This page describes how to plan your MongoDB Search search experience and define an MongoDB Search index and query to fit your search requirements.
Planeje sua experiência de pesquisa
When planning your MongoDB Search implementation, start by defining the search experience you want to deliver:
Identifique claramente quais tipos de pesquisa seu aplicativo precisa realizar. Você está desenvolvendo um recurso de pesquisa para um blog que necessita de pesquisa de texto completo e autocompletar para títulos de artigos, ou um site de e-commerce que requer pesquisa facetada e filtro por categorias de produtos?
Determine como os usuários interagirão com seu aplicação. Priorize recursos que melhorarão a experiência do usuário, como tempos de resposta rápidos ou sugestões precisas de preenchimento automático.
Then, consider the following questions to help determine the structure of your MongoDB Search indexes and queries based on those user needs:
Considere se os usuários do aplicação desejam retornar o conteúdo dos documentos ou metadados sobre seus documentos:
Se os usuários quiserem o conteúdo do documento, use a fase de agregação
$search
para retornar documentos que atendam aos critérios de pesquisa.Se os usuários quiserem metadados sobre os resultados das pesquisas, use a fase
$searchMeta
para retornar contagens personalizáveis de documentos e facetas correspondentes.
Identify the specific fields within your collections that users are likely to search so that you know which fields to index. Each MongoDB Search query searches a single MongoDB Search index, which contains terms that are extracted from one or more specified fields within a collection. When planning your MongoDB Search queries, decide whether to index only key fields or every field in your specified collection by enabling static or dynamic mapping. You can query across multiple fields by specifying the query path as an array of fields, or by using the queryString operator.
Os termos de pesquisa comuns dos seus usuários podem ser correspondências exatas, semelhantes ou parciais para os dados no seu Atlas cluster. Por exemplo, os usuários de um aplicação de análise de filmes podem querer filtrar filmes de um ano exato ou ver recomendações de filmes semelhantes ao seu filme favorito.
Determine the type of matches your users are searching for to inform which operators to use in your MongoDB Search queries:
Para correspondências exatas, use operadores como equals ou in para encontrar documentos que contenham termos idênticos ao valor
query
especificado. Você também pode usar o operador text para corresponder a documentos que contêmany
ouall
das strings no valorquery
.Para correspondências semelhantes, use operadores como near, moreLikeThis ou phrase para encontrar documentos que contenham valores numéricos, documentos ou ordenações de strings que sejam semelhantes aos termos de pesquisa especificados. Você também pode usar o operador range para encontrar documentos que contenham um valor dentro de um intervalo especificado de valores.
Para correspondências parciais, como queries de pesquisa conforme o tipo, use operadores como autocomplete, regex ou wildcard para implementar a funcionalidade de pesquisa conforme o tipo ou faça a correspondência de termos usando expressões regulares.
Use o operador composto para combinar múltiplos comportamentos de correspondência em uma única query.
For applications that require text normalization, multi-language support, stemming, or more, leverage MongoDB Search text analysis tools:
Escolha um analisador integrado na definição do seu índice para corresponder ao idioma e à natureza dos seus dados de texto. Os analisadores dividem o texto em termos ou tokens e podem ajustá-lo para remover pontuação e letras maiúsculas, converter palavras para sua forma raiz e muito mais.
Configure analisadores personalizados se seu aplicação tiver requisitos específicos, como lidar com termos específicos do domínio ou analisar texto formatado, como endereços de e-mail ou IDs separados por traços. Analisadores personalizados permitem filtrar texto por caractere, definir o número de caracteres a serem incluídos em cada bloco de token ou ativar derivação ou supressão.
Defina sinônimos para melhorar a precisão da pesquisa de termos com significados iguais ou semelhantes.
Você pode ajustar a apresentação dos resultados da pesquisa com base nas demandas de filtro, ordenação ou relevância dos seus usuários:
Use the score query option to modify the relevance score of documents and affect the order in which users view results. MongoDB Search queries associate a relevance-based score with every document in the result set, and returns documents in order from the highest to the lowest score.
Defina a opção de query sort para campos indexados que os usuários provavelmente ordenarão em ordem crescente ou decrescente, como datas ou campos numéricos.
Use as opções de query searchBefore ou searchAfter para exibir os resultados como um conjunto de páginas pelas quais os usuários podem navegar sequencialmente ou avançar.
Use o coletor
facet
(Operador de Atlas Search) para permitir que os usuários filtrem os resultados por categorias ou outras dimensões. Isso pode melhorar significativamente a relevância dos resultados da pesquisa, oferecendo aos usuários uma experiência de pesquisa mais guiada.
MongoDB Search query performance is affected by your index configuration and the complexity of your queries. Focus on indexing fields that are critical to your application's search functionality and aim for a logical balance between query complexity and speed.
Para otimizar ainda mais o desempenho, considere as seguintes opções de query:
Use a opção de query concorrente para definir o número de solicitações de pesquisa concorrentes que são executadas ao avaliar uma query. Essa opção é útil para queries complexas ou grandes conjuntos de dados.
Use a opção de query returnStoredSource em conjunto com a opção de índice storedSource para determinar se os documentos de origem originais, armazenados como parte do índice, devem ser retornados junto com os resultados da pesquisa. Essa opção é útil para aplicativos onde você exibe resumos ou destaques com base nos critérios de pesquisa.
Use a opção de índice numPartitions para particionar seu índice, distribuindo objetos de índice entre subíndices de maneira ideal.
For more recommendations on how to optimize your query performance, see MongoDB Search Query Performance.
Defina seu índice
Before you can search your data using MongoDB Search, you must create one or more MongoDB Search indexes to be used during your MongoDB Search query. This section demonstrates how to apply your query preferences to the JSON configuration syntax of an MongoDB Search index.
Para usar a sintaxe JSON nesta seção da sua definição de índice, substitua os espaços reservados por valores válidos e assegure-se de que sua definição completa de índice inclua as opções necessárias.
To learn how to add your MongoDB Search index to your Atlas cluster, see the MongoDB Search Quick Start.
Escolha quais campos indexar.
If you know which fields you want to query in your collection, enable static mappings and specify the fields in your MongoDB Search index definition. Otherwise, you can enable dynamic mappings to automatically index all the fields of supported types.
Para saber mais, consulte Mapeamentos estáticos e dinâmicos.
Observação
If your collection contains documents that are 16MB or larger, MongoDB Search fails to index your data. This issue can also occur when update operations on large documents cause the change stream event to exceed the 16MB BSON limit. To avoid this, consider the following best practices:
Estruture seus documentos para minimizar o tamanho de subdocumentos ou arrays.
Evite operações que atualizem ou substituam campos grandes, subdocumentos ou arrays.
Para aprender mais, veja Recomendações de Produção de Change Streams e Reduzir o Tamanho de Documentos Grandes.
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { // Optional, use this to configure individual fields 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
1 { 2 "mappings": { 3 "dynamic": false, // Optional, if omitted defaults to "false" 4 "fields": { 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
(Opcional) Aplique regras de análise de texto.
Se você tiver requisitos especiais de idioma ou análise, poderá aplicar as seguintes opções à definição do índice:
Especifique quais analisadores internos aplicar aos campos de string que você está indexando nos campos analyzer
, searchAnalyzer
ou fields.<field-name>.analyzer
.
1 { 2 "analyzer": "<index-analyzer-name>", // top-level index analyzer, used if no analyzer is set in the field mappings 3 "searchAnalyzer": "<search-analyzer-name>", // query text analyzer, typically the same as the index analyzer 4 "mappings": { 5 "dynamic": <boolean>, 6 "fields":{ 7 "<field-name>": [ 8 { 9 "type": "string", 10 "analyzer": "<field-analyzer-name>" // field-specific index analyzer 11 } 12 ] 13 } 14 } 15 }
Define custom analyzers for your MongoDB Search index in the analyzers
field.
1 { 2 "analyzers": [ 3 { 4 "name": "<custom-analyzer-name>", 5 "tokenizer": { 6 "type": "<tokenizer-type>" 7 } 8 }, 9 ... 10 ] 11 }
Defina sinônimos para termos que tenham significados iguais ou semelhantes no campo synonyms
.
1 { 2 "synonyms": [ 3 { 4 "name": "<synonym-mapping-name>", 5 "source": { 6 "collection": "<source-collection-name>" 7 }, 8 "analyzer": "<synonym-mapping-analyzer>" 9 } 10 ] 11 }
(Opcional) Adicione opções para otimizar o desempenho da query.
If you want to optimize your query performance on a large dataset, you can add the following options to your index definition to limit the amount of data that your MongoDB Search query must traverse:
Use the numPartitions option to configure partitions for your index. When you partition your index, MongoDB Search automatically distributes the index objects between sub-indexes in an optimal way.
1 { 2 "numPartitions": <integer>, 3 }
Use the storedSource option to specify fields in the source document that MongoDB Search must store.
1 { 2 "storedSource": true | false | { 3 "include" | "exclude": [ 4 "<field-name>", 5 ... 6 ] 7 } 8 }
Defina sua query
After you create an MongoDB Search index for all the fields that you want to search in your collection, you can run an MongoDB Search query. This section demonstrates how to apply your goals for your application's search experience to the JSON syntax of an MongoDB Search query.
To use the JSON syntax in this section in your MongoDB Search query aggregation pipeline, replace the placeholders with valid values and ensure that your full query pipeline contains the required $search fields or $searchMeta fields.
To learn how to run a Search query, see the MongoDB Search Quick Start.
Choose your initial MongoDB Search pipeline stage.
The first stage of your MongoDB Search query aggregation pipeline must be either the $search
or $searchMeta
stage, depending on whether you're searching for documents or metadata:
Estágio do pipeline de agregação | Propósito |
---|---|
Retornar resultados da pesquisa de texto completo. | |
Retornar metadados sobre seus resultados de pesquisa. |
Aplique operadores para definir seus critérios de pesquisa.
Para definir seus critérios de pesquisa, você deve aplicar um ou mais operadores ou coletores ao seu $search
ou $searchMeta
fase do pipeline.
MongoDB Search operators allow you to locate and retrieve relevant data from your Atlas cluster according to content, format, or data tyoe. To learn which operators support searches for each field type, see the table in the operators reference section. You must specify one or more indexed search fields in the operator's query path parameter:
1 { 2 $search: { 3 "<operator-name>"|"<collector-name>": { 4 <operator-specification>|<collector-specification> 5 } 6 } 7 }
[ { _id: <result-document-id>, ... }, { _id: <result-document-id>, ... }, ... ]
1 { 2 $searchMeta: { 3 "<operator-name>"|"<collector-name>": { 4 <operator-specification>|<collector-specification> 5 } 6 } 7 }
[ { count: { total: <results-count> } } ]
(Opcional) Aplique opções ou coletores para retornar metadados.
If you want to retrieve metadata from your MongoDB Search query, you can apply one of the following configurations to choose between the count or facet
(Atlas Search Operator) type of metadata results document:
Para retornar a contagem total ou com limite inferior dos resultados da pesquisa, defina a opção de contagem no estágio de agregação.
O estágio $searchMeta
retorna os resultados de metadados count
, enquanto o estágio $search
armazena os resultados de metadados na variável de agregação $$SEARCH_META e retorna somente os resultados da pesquisa. Para ver um exemplo de como recuperar os resultados de metadados count
da variável $$SEARCH_META
, consulte Contagem de resultados.
1 { 2 "$search" | "$searchMeta": { 3 "<operator-name>": { 4 <operator-specifications> 5 }, 6 "count": { 7 "type": "lowerBound" | "total", 8 "threshold": <number-of-documents> // Optional 9 } 10 } 11 }
Para executar uma query de faceta, que agrupa resultados por valores ou intervalos e retorna a contagem para cada um desses grupos, use o coletor facet
(Operador de Atlas Search) em seu estágio de agregação.
A fase $searchMeta
retorna facet
resultados de metadados, enquanto a fase $search
armazena os resultados de metadados na variável de agregação $$SEARCH_META e retorna apenas os resultados da pesquisa. Para um exemplo de como recuperar os resultados de metadados facet
da variável $$SEARCH_META
, consulte Resultados de faceta.
1 { 2 "$search" | "$searchMeta": { 3 "facet": { 4 "facets": { 5 <facet-definitions> 6 } 7 } 8 } 9 }
(Optional) Add search options to your $search stage to retrieve additional information about your MongoDB Search query.
Você pode recuperar informações adicionais sobre os resultados da fase $search
usando as seguintes opções:
Opção | Caso de uso |
---|---|
Exiba seus termos de pesquisa em seu contexto original como campos no resultado da consulta. | |
Retrieve a detailed breakdown of the score for each document MongoDB Search returns. | |
Rastreie e forneça informações analíticas para seus termos de pesquisa de query. | |
Retrieve analytics about which Lucene queries MongoDB Search executed to satify your query, and how much time your query spends in the various stages of execution. |
(Opcional) Adicione opções de $search para definir a classificação dos resultados.
Você pode implementar uma funcionalidade especial de ordenação para seus resultados de $search
com as seguintes opções:
Opção | Caso de uso |
---|---|
Modify the relevance score of the documents in the results to ensure MongoDB Search returns relevant results. | |
Classifique seus resultados por número, string e campos de data ou por pontuação. | |
Defina um ponto de referência para parar ou iniciar seus resultados ordenados |
(Opcional) Adicione opções de $search para otimizar o desempenho da consulta.
Otimize o desempenho da query usando as seguintes opções de $search
:
Opção | Caso de uso |
---|---|
Run your MongoDB Search query more efficiently by only retrieving fields stored on | |
Paralelize a procura entre segmentos em nós de pesquisa dedicados. |
Saiba mais
To learn how to build and run an MongoDB Search index and MongoDB Search query, see the MongoDB Search Quick Start.
To learn more about the MongoDB Search query configuration options mentioned in this tutorial, see the following reference pages:
To learn more about the MongoDB Search index configuration options mentioned in this tutorial, see the following reference pages: