Ao criar um índice de pesquisa MongoDB, você pode especificar quais campos indexar usando os seguintes métodos:
Mapeamentos dinâmicos: Habilite a pesquisa do MongoDB para criar índices automaticamente em todos os campos com base em um conjunto padrão ou configurado de tipos de campo (
typeSet).Mapeamentos estáticos: permitem que você especifique quais campos incluir no índice.
Limitações de tipos de dados
Por padrão, o MongoDB pesquisa para de replicar alterações para índices maiores que 2.1 bilhões de objetos de índice em um conjunto de réplicas ou fragmento único, onde cada documento indexado ou aninhado
embeddedDocumentconta como um único objeto. Isso significa que seu índice permanece consultável, mas você pode obter resultados obsoletos.If you plan to index fields that might exceed 2.1 billion objects, where an index object is a top-level document or an embedded document, use the numPartitions index option to partition your index (supported only on Search Nodes deployment) or shard your cluster.
Você não pode indexar campos que contêm o sinal de dólar (
$) no início do nome do campo.O tipo de campo autocomplete pode criar índices grandes e levar mais tempo para ser criado do que outros tipos de campo. Embora você possa usar o tipo
autocompleteem mapeamentos dinâmicos incluindo-o em uma definição detypeSetpersonalizada, recomendamos o uso do tipoautocompleteem mapeamentos estáticos apenas para evitar implicações não intencionais de desempenho, armazenamento e pontuação. Para saber mais, consulte Como indexar campos para preenchimento automático e Desempenho do índice do MongoDB Search.
Sintaxe
A sintaxe a seguir demonstra como habilitar o MongoDB Search para indexar campos usando mapeamentos dinâmicos e estáticos. Para saber mais sobre mapeamentos dinâmicos e estáticos, consulte Mapeamentos dinâmicos e estáticos.
1 { 2 "mappings": { 3 "dynamic": true|false | { 4 "typeSet": "<typeset-name>" 5 }, 6 "fields": { 7 "<field-name>": { 8 "type": "<field-type>", 9 ... 10 }, 11 ... 12 } 13 }, 14 "typeSets": [ 15 { 16 "name": "<typeset-name>", 17 "types": [ 18 { 19 "type": "<field-type>", 20 ... 21 }, 22 ... 23 ] 24 }, 25 ... 26 ] 27 }
Mapeamentos dinâmicos e estáticos
Você pode configurar a Pesquisa MongoDB com:
Mapeamentos dinâmicos para indexar automaticamente campos com base em um conjunto de tipos padrão ou configurado (
typeSet)Mapeamentos estáticos apenas para campos especificados do índice
Você também pode usar mapeamentos dinâmicos com mapeamentos estáticos. Os mapeamentos estáticos substituem a configuração de mapeamentos dinâmicos.
Mapeamentos dinâmicos
Os mapeamentos dinâmicos do MongoDB pesquisa permitem configurar o MongoDB pesquisa para indexar automaticamente e recursivamente campos em seus dados. Os campos podem ser indexados com base no conjunto padrão de tipos ou configurando um typeSet.
Você pode habilitar ou configurar mapeamentos dinâmicos:
No nível raiz
mappingspara aplicar a todo o documento.[Recomendado] Dentro de um tipo de campo
documentpara aplicar a um objeto especificado.[Recomendado] Em um tipo de campo
embeddedDocumentspara aplicar a uma array especificada de objetos que exigem comparações de query por elemento (semelhante a$elemMatch).
Observação
Melhores práticas
Os mapeamentos dinâmicos podem resultar na indexação de um grande número de campos exclusivos, que ocuparão mais espaço em disco e podem ter menos desempenho. Use mapeamentos dinâmicos somente se precisar indexar campos que mudam regularmente ou que são desconhecidos. Sempre use mapeamentos dinâmicos em um documento, não no nível do documento pai.
Quando você utiliza mapeamentos dinâmicos para indexar seus dados:
O MongoDB Search também indexa dinamicamente todos os campos aninhados suportados pelo
typeSetem um objetodocumentem seus dados.Se um campo contiver dados polimórficos, o MongoDB pesquisa indexará automaticamente o campo como todos os tipos suportados pelo
typeSetusado no índice. Se um campo contiver dados de um tipo não suportado pelatypeSetpesquisa, o MongoDB não indexará estes dados.
Habilitar padrão typeSet
A Pesquisa do MongoDB usa o typeSet padrão quando dynamic é definido como true. No typeSet padrão, a Pesquisa do MongoDB indexa ostipos de BSON como tipos de campo de pesquisa do MongoDB. A tabela seguinte mostra os tipos BSON que o MongoDB pesquisa automaticamente inclui no índice como tipos de campo do MongoDB pesquisa quando você utiliza o typeSet padrão. O MongoDB Search também indexa automaticamente os seguintes tipos de BSON quando eles estão contidos em arrays e objetos.
BSON Tipo | Tipo de campo de pesquisa do MongoDB |
|---|---|
Boolean | |
Data | |
Double, 32bits inteiros, 64bits inteiros | |
ObjectId | |
String | |
UUID | |
Zero |
A seguir está a sintaxe para ativar o conjunto de tipos padrão para mapeamentos dinâmicos:
1 { 2 "mappings": { 3 "dynamic": true 4 } 5 }
Para exemplos de índice que demonstram a indexação de todos os campos usando o typeSet padrão, consulte Exemplos de mapeamento dinâmico.
configurea typeSet
Especifique os tipos de campo do MongoDB Search para indexar dinamicamente configurando um typeSet. Você pode configurar qualquer tipo BSON para ser indexado automaticamente como qualquer tipo de campo do MongoDB Search, exceto document, embeddedDocuments, vector ou tipos de campo obsoletos.
Um typeSet tem a seguinte sintaxe:
Observação
Você não pode configurar um typeSet a partir da IU do Atlas Visual Editor. Em vez disso, use a interface da IU JSON Editor do Atlas.
1 { 2 "mappings": { 3 "dynamic": { 4 "typeSet": "<typeset-name>" 5 }, 6 "fields": { 7 "<field-name>": { 8 "type": "<field-type>", 9 ... 10 }, 11 ... 12 } 13 }, 14 "typeSets": [ 15 { 16 "name": "<typeset-name>", 17 "types": [ 18 { 19 "type": "<field-type>" 20 }, 21 ... 22 ] 23 }, 24 ... 25 ] 26 }
Antes de configurar um typeSet, considere o seguinte:
Você não pode definir o mesmo tipo de campo várias vezes no mesmo objeto
typeSet. Você pode configurar somente uma definiçãotypeSetpara cada tipo de campo .Por exemplo, você não pode definir várias configurações para o tipo
numberna mesma definiçãotypeSet.Você pode configurar mapeamentos dinâmicos com o analisador
multi.
Para exemplos de índice que demonstram o uso de configuração personalizada typeSet, consulte Exemplos de mapeamento dinâmico.
Mapeamentos estáticos
Use mapeamentos estáticos para configurar opções de índice para campos que você não deseja indexados dinamicamente ou para configurar um único campo independentemente de outros em um índice. Quando você utiliza mapeamentos estáticos, o MongoDB Search indexa somente os campos que você especifica no mappings.fields. Você também pode usar mapeamentos estáticos para excluir campos de serem indexados.
Para utilizar mapeamentos estáticos para configurar opções de índice para somente alguns campos, defina mappings.dynamic para false e especifique o nome do campo, tipo de dados e outras opções de configuração para cada campo que você deseja indexar. Você pode especificar os campos em qualquer ordem.
Se você omitir o campo mappings.dynamic, ele será padronizado como false.
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
Para definir o índice para um campo aninhado, você deve definir os mapeamentos para cada campo pai daquele campo aninhado. Você não pode usar notação de ponto para acessar estaticamente o índice de campos aninhados. Por exemplo, consulte os Exemplos ou Exemplo de mapeamento combinado abaixo.
Você pode usar mapeamentos estáticos para criar índices de campos como vários tipos. Para definir um campo como vários tipos, defina os tipos na array de definição do campo para o campo. Você pode usar qualquer campo como qualquer tipo suportado usando mapeamentos estáticos para índice. Para saber mais, consulte Tipos de Campo de Pesquisa MongoDB.
O exemplo a seguir mostra a definição de campo para indexar um campo como tipos múltiplos.
1 { 2 "mappings": { 3 "dynamic": true|false | { 4 "typeSet": "<type-set-name>" 5 }, 6 "fields": { 7 "<field-name>": [ 8 { 9 "type": "<field-type>", 10 ... 11 }, 12 { 13 "type": "<field-type>", 14 ... 15 }, 16 ... 17 ], 18 ... 19 } 20 }. 21 "typeSets": [ 22 { 23 "name": "<typeset-name>", 24 "types": [ 25 { 26 "type": "<field-type>" 27 }, 28 ... 29 ] 30 }, 31 ... 32 ] 33 }
Para outros exemplos de índice que demonstram mapeamentos estáticos, consulte Exemplo de mapeamento estático.
Tipos de campo de pesquisa do MongoDB
A Pesquisa do MongoDB não suporta os seguintes tipos de dados BSON:
Decimal128
JavaScript code with scope
Tecla máxima
Min key
Expressão regular
Timestamp
A Pesquisa do MongoDB armazena automaticamente campos do tipo string no mongot. Você pode armazenar campos de todos os tipos de dados suportados na MongoDB Search usando a opção Definir campos de origem armazenados no seu índice de pesquisa do MongoDB em sua definição de índice. Para saber mais sobre mongot e a arquitetura de nó do MongoDB Search, consulte Opções de sistema do MongoDB Search.
A tabela a seguir enumera os tipos de dados BSON compatíveis e os tipos de campo do MongoDB pesquisa que você pode usar para indexar os tipos de dados BSON. A tabela também lista os operadores e coletores que você pode utilizar para consultar os valores de campo.
Tipo de JSON | Tipo de campo de pesquisa do MongoDB | operadores e coletores |
|---|---|---|
Operadores que são compatíveis com o tipo de dados na array. | ||
Boolean | ||
Data | ||
Data | ||
Double | ||
Double | ||
Double | ||
Inteiro de bits | ||
Inteiro de bits | ||
Inteiro de 64 bits | ||
Inteiro de 64 bits | ||
Zero | N/A | |
Objeto | Operadores que suportam os tipos de campo no objeto. | |
Objeto | embeddedDocument (para array de objetos) | |
ObjectId | ||
String | ||
String | ||
String | ||
String | ||
vetor |
Esses operadores não suportam um array de strings.
A Pesquisa do MongoDB não inclui um tipo de campo para indexar valores nulos porque o MongoDB Search indexa automaticamente valores nulos para campos indexados estático e dinamicamente.
Obsoleto. Para saber mais sobre os tipos de campo de faceta obsoletos e suas contrapartes atualizadas, veja Comparando tipos de campo de faceta.
Array com valor double ou int.
Observação
Você pode armazenar campos de todos os tipos de dados suportados na MongoDB Search usando a opção storedSource.
Exemplos
The following sample index definitions on the sample_mflix.movies collection demonstrate how to index fields using dynamic and static mappings. You can load the sample data on your cluster to try the examples. To learn more about how to create MongoDB Search indexes, see MongoDB Search Quick Start.
Exemplos de mapeamento dinâmico
As seguintes definições de índice de amostra demonstram como utilizar mapeamentos dinâmicos.
A seguinte definição de índice:
Habilita mapeamentos dinâmicos no nível raiz para indexar automaticamente os campos na coleção com base na definição
typeSetdenominadaonly_strings, que indexa campos de string na coleção com a opção de índicepositionse comstoredefinido comofalse. Essas opções de configuração economizam espaço em disco ao não armazenar os valores de campo ou deslocamentos de termo para realce de query.
{ "mappings": { "dynamic": { "typeSet": "only_strings" } }, "typeSets": [ { "name": "only_strings", "types": [ { "type": "string", "store": false, "indexOptions": "positions" } ] } ] }
A seguinte definição de índice:
Permite mapeamentos dinâmicos no nível raiz para indexar dinamicamente campos na coleção com base no
typeSetdenominadoonly_strings, que indexa campos de string na coleção com a opção de índicepositionse comstoredefinido comofalse, que economiza espaço em disco ao não armazenar os valores de campo ou compensações de termo para realce de query.Indexa o campo
awardscomo o tipodocumente usa a opçãodynamiccom oonly_numberstypeSetpara indexar dinamicamente somente os subcampos numéricos no documentoawards. Isso significa que os subcampos numéricoswinsenominationssão indexados, mas o subcampo de stringtextnão é indexado.
{ "mappings": { "dynamic": { "typeSet": "only_strings" }, "fields": { "awards": { "type": "document", "dynamic": { "typeSet": "only_numbers" } } } }, "typeSets": [ { "name": "only_numbers", "types": [ { "type": "number" } ] }, { "name": "only_strings", "types": [ { "type": "string", "store": false, "indexOptions": "positions" } ] } ] }
A seguinte definição de índice:
Configura mapeamentos dinâmicos para tipos específicos de campo usando o
typeSetchamadoindexedTypes, que especifica o seguinte comportamento:Indexe automaticamente campos de string como o tipo
token.Indexe automaticamente campos numéricos como o tipo
number.
Exclui o campo
plotde ser incluído no índice.
{ "mappings": { "dynamic": { "typeSet": "indexedTypes" }, "fields": { "plot": [] } }, "typeSets": [ { "name": "indexedTypes", "types": [ { "type": "token" }, { "type": "number" } ] } ] }
Exemplo de mapeamento estático
As seguintes definições de índice de amostra demonstram como utilizar mapeamentos estáticos.
A seguinte definição de índice:
Especifica mapeamentos de campo estáticos no nível raiz (
dynamic:false), o que significa que campos que não são especificados nomappings.fieldsnão são indexados. A definição do índice inclui explicitamente os seguintes campos para indexação:O campo
awards, que é do tipodocument. Possui três subcampos incorporados,wins,nominationsetext.Os subcampos
winsenominationscontêm dados numéricos e são indexados como o tiponumber.nominationsé indexado com a representaçãoint64, o que lhe permite suportar valores inteiros maiores do que o tiponumberpadrão.O subcampo
textcontém dados de string e é indexado como o tipostringutilizando o analisador lucene.english, que é otimizado para texto em inglês. O campotexttambém usa a opçãoignoreAbovepara ignorar qualquer string de mais de 255 caracteres.O campo
title, que contém dados de string e é indexado como tipostringusando o analisador lucene.whitespace, otimizado para texto que contém muitos espaços em branco, como nomes ou títulos de produtos. O campotitleutiliza a opção multi para especificar o analisador lucene.french como um analisador secundário. Isso permite que você especifique{ "value": "title", "multi": "frenchAnalyzer" }comopathem suas$searchqueries para direcionar melhor os termos de query em francês.O campo
genres, que contém uma array de strings e é indexado como o tipostring. O MongoDB Search indexa os elementos de array usando o analisador lucene.standard por padrão. Para indexação de arrays, o MongoDB Search exige apenas o tipo de dados dos elementos do array. Você não precisa especificar que os dados estão contidos em um array na definição de índice.
{ "mappings": { "dynamic": false, "fields": { "awards": { "type": "document", "fields": { "wins": { "type": "number" }, "nominations": { "type": "number", "representation": "int64" }, "text": { "type": "string", "analyzer": "lucene.english", "ignoreAbove": 255 } } }, "title": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "frenchAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "genres": { "type": "string" } } } }
Exemplo de mapeamento combinado
Os seguintes exemplos de definição de índice combinam mapeamentos dinâmicos com mapeamentos estáticos.
Essa definição de índice:
Especifica mapeamentos de campo estáticos (
dynamic:false), o que significa que campos e tipos de campo que não são explicitamente mencionados não são indexados. Então, a definição do índice inclui:O campo
title, que contém dados de string e é indexado como o tipostringusando o analisador lucene.whitespace, otimizado para texto que contém muitos espaços em branco, como nomes ou títulos de produtos.O campo
awards, que é do tipodocumente contém três subcampos. Os subcamposwinsenominationscontêm dados numéricos e o subcampotextcontém dados de string. Em vez de definir explicitamente o tipo de dados para cada campo aninhado no documento, a definição de índice permite o mapeamento dinâmico para todos os subcampos no documento. Isto indexawinsenominationscomo o tiponumberetextcomo o tipostring. Os dados no campotextsão indexados utilizando o analisador lucene.standard por padrão.
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "string", "analyzer": "lucene.whitespace" }, "awards": { "type": "document", "dynamic": true } } } }
Essa definição de índice:
Especifica mapeamentos de campo estáticos no nível raiz (
dynamic:false), o que significa que os campos que não são especificados na opçãomappings.fieldsnão são indexados.Define mapeamentos dinâmicos para o campo
awards, que é do tipodocument, utilizando otypeSetpersonalizado denominadomovieAwards. O campoawardstem três subcampos incorporados:wins,nominationsetext. Em vez de indexar automaticamente os subcampos definindodynamiccomotrueno nível raiz ou indexando explicitamente cada campo aninhado usando mapeamentos estáticos, a definição de índice configura mapeamentos dinâmicos para o tipo de campodocumentusando otypeSetdefinição chamadamovieAwards. OmovieAwardstypeSetfaz o seguinte:Indexes campos de string como o tipo
stringusando a opção multi para especificar vários analisadores:lucene.englishelucene.french.Indexa campos numéricos como tipo
numberutilizando as configurações padrão para o tiponumber.{ "mappings": { "dynamic": false, "fields": { "awards": { "type": "document", "dynamic": { "typeSet": "movieAwards" } } } }, "typeSets": [ { "name": "movieAwards", "types": [ { "type": "string", "multi": { "english": { "type": "string", "analyzer": "lucene.english" }, "french": { "type": "string", "analyzer": "lucene.french" } } }, { "type": "number" } ] } ] }