Cuando se crea un índice de MongoDB Search, se puede especificar qué campos indexar utilizando los siguientes métodos:
Mapeos dinámicos: habilite MongoDB Search para indexar automáticamente todos los campos según un conjunto de tipos de campos predeterminado o configurado (
typeSet).Mapeos estáticos: Permiten especificar qué campos se deben indexar.
Limitaciones de tipos de datos
Por defecto, MongoDB Search deja de replicar cambios para índices superiores a 2.1 mil millones de objetos de índice en un set de réplicas o una sola partición, donde cada documento indexado o embeddedDocument anidado cuenta como un solo objeto. Esto significa que el índice sigue siendo consultable, pero se podrían obtener resultados desactualizados.
Si planea indexar campos que podrían exceder 2.1 mil millones de objetos, donde un objeto de índice es un documento de nivel superior o un documento incrustado, utilice el Opción de índicenumPartitions para particionar su índice (compatible solo con la implementación de nodos de búsqueda) o fragmentar su clúster.
No puedes indexar campos que contengan el signo de dólar ($) al inicio del nombre del campo.
Sintaxis
La siguiente sintaxis muestra cómo habilitar MongoDB Search para indexar campos mediante asignaciones dinámicas y estáticas. Para obtener más información sobre las asignaciones dinámicas y estáticas, consulte Mapeos dinámicos y 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 }
Mapeos dinámicos y estáticos
Se puede configurar MongoDB Search con:
Mapeos dinámicos para indexar automáticamente los campos según un conjunto por defecto o configurado de tipos (
typeSet)Mapeos estáticos para indexar solo campos especificados
También puede utilizar asignaciones dinámicas con asignaciones estáticas. Las asignaciones estáticas tienen prioridad sobre la configuración de las asignaciones dinámicas.
Mapeos dinámicos
Los mapeos dinámicos de MongoDB Search permiten configurar MongoDB Search para indexar automática y recursivamente los campos en los datos. Los campos se pueden indexar en función del conjunto de tipos por defecto o configurando un typeSet.
Se pueden activar o configurar mapeos dinámicos:
En el nivel raíz
mappingspara aplicarse a todo el documento.[Recomendado] Dentro de un tipo de campo
documentpara aplicarlo a un objeto especificado.[Recomendado] Dentro de un tipo de campo
embeddedDocumentspara aplicar a un arreglo especificado de objetos que requieren comparaciones de queries elemento por elemento (similar a$elemMatch).
Nota
Mejores prácticas
Los mapeos dinámicos podrían resultar en la indexación de un alto número de campos únicos, lo que ocupará más espacio en disco y podría ser menos eficiente. Se deben utilizar únicamente asignaciones dinámicas si se necesita crear un índice de campos que cambian regularmente o que son desconocidos. Siempre se deben utilizar asignaciones dinámicas dentro de un documento, no a nivel del documento principal.
Cuando se utilizan mapeos dinámicos para crear un índice para los datos:
MongoDB Search también indexa dinámicamente todos los campos anidados admitidos por el
typeSeten un objetodocumenten los datos.Si un campo contiene datos polimórficos, MongoDB Search indexa automáticamente el campo como todos los tipos admitidos por el
typeSetutilizado en el índice. Si un campo contiene datos de un tipo no compatible contypeSet, MongoDB Search no indexará esos datos.
Activar por defecto typeSet
MongoDB Search usa el valor predeterminado typeSet cuando dynamic se establece en true. En el valor predeterminado typeSet, MongoDB Search indexa TiposBSON como tipos de campo de MongoDB Search. La siguiente tabla muestra los tipos BSON que MongoDB Search indexa automáticamente como tipos de campo al usar el valor typeSet predeterminado. MongoDB Search también indexa automáticamente los siguientes tipos BSON cuando están contenidos en matrices y objetos.
Tipo BSON | Tipo de campo de búsqueda de MongoDB |
|---|---|
Booleano | |
fecha | |
Double, entero de 32 bits, entero de 64 bits | |
ObjectId | |
String | |
UUID | |
Nulo |
La siguiente es la sintaxis para activar el conjunto de tipos por defecto para las asignaciones dinámicas:
1 { 2 "mappings": { 3 "dynamic": false 4 } 5 }
Para ver ejemplos de índices que demuestran la indexación de todos los campos utilizando el valor por defecto typeSet, se puede consultar Ejemplos de mapeo dinámico.
Configure una typeSet
Especificar los tipos de campos de MongoDB Search para la indexación de forma dinámica configurando un typeSet. Se puede configurar cualquier tipo de BSON para que se indexe automáticamente como cualquier tipo de campo de búsqueda de MongoDB, excepto document, embeddedDocuments, vector, o los tipos de campo obsoletos.
Un typeSet tiene la siguiente sintaxis:
Nota
No se puede configurar un typeSet desde la interfaz de usuario de Atlas
Visual Editor. Utilice la interfaz de usuario Atlas JSON Editor en su lugar.
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 un typeSet, se debe considerar lo siguiente:
No se puede definir el mismo tipo de campo varias veces en el mismo objeto
typeSet. Solo se puede configurar una única definicióntypeSetpara cada tipo de campo.Por ejemplo, no se pueden definir múltiples configuraciones para el tipo
numberen la misma definición detypeSet.Se pueden configurar mapeos dinámicos con el analizador
multi.
Para ejemplos de índice que demuestran el uso de la configuración personalizada de typeSet, consultar Ejemplos de mapeo dinámico.
Mapeos estáticos
Utilizar mapeos estáticos para configurar opciones de índice para campos que no se desea indexar dinámicamente, o para configurar un solo campo independientemente de otros en un índice. Cuando se utilizan asignaciones estáticas, MongoDB Search crea índices de búsqueda solo de los campos que se especifican en mappings.fields. También se pueden utilizar asignaciones estáticas para excluir campos del índice.
Para utilizar asignaciones estáticas para configurar las opciones de índice solo para algunos campos, se debe establecer mappings.dynamic en false y especificar el nombre del campo, tipo de dato y otras opciones de configuración para cada campo que se desee indexar. Se pueden especificar los campos en cualquier orden.
Si omite el campo mappings.dynamic, se establece por defecto en 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 el índice de un campo anidado, se deben definir los mapeos para cada campo principal de ese campo anidado. No se puede usar la notación de puntos para usar el índice de campos anidados de forma estática. Para ver ejemplos, se pueden consultar los Ejemplos o Ejemplo de mapeo combinado a continuación.
Se pueden utilizar mapeos estáticos para indexar campos como múltiples tipos. Para indexar un campo como varios tipos, se deben definir los tipos en el arreglo de definición del campo. Se puede indexar cualquier campo como cualquier tipo admitido usando mapeos estáticos. Para aprender más, se puede consultar Tipos de campos de MongoDB Search.
El siguiente ejemplo muestra la definición de un campo para la indexación del mismo como múltiples tipos.
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 otros ejemplos de índices que demuestran mapeos estáticos, se puede consultar Ejemplo de mapeo estático.
Tipos de campo de búsqueda de MongoDB
MongoDB Search no admite los siguientes tipos de datos BSON:
Decimal128
Código JavaScript con alcance
Clave máxima
Min key
Expresión regular
Marca de tiempo
MongoDB Search almacena automáticamente campos de tipo string en mongot. Se pueden almacenar campos de todos los tipos de datos compatibles en MongoDB Search usando la opción Definir campos fuente almacenados en su índice de MongoDB Search en la definición del índice. Para aprender más sobre mongot y la arquitectura de nodos de MongoDB Search, se puede consultar Opciones de implementación de MongoDB Search.
La siguiente tabla enumera los tipos de datos BSON admitidos y los tipos de campos de MongoDB Search que se pueden utilizar para indexar los tipos de datos BSON. La tabla también indica los operadores y coleccionistas que se pueden usar para consultar los valores de los campos.
Tipo BSON | Tipo de campo de búsqueda de MongoDB | Operadores y recolectores |
|---|---|---|
Operadores que admiten el tipo de datos en el arreglo. | ||
Booleano | ||
fecha | ||
fecha | ||
Double | ||
Double | ||
Double | ||
entero de 32 bits | ||
entero de 32 bits | ||
entero de 64 bits | ||
entero de 64 bits | ||
Nulo | N/A | |
Objeto | Operadores que brindan soporte a los tipos de campo en el objeto. | |
Objeto | embeddedDocument (para un arreglo de objetos) | |
ObjectId | ||
String | ||
String | ||
String | ||
String | ||
vector |
Estos operadores no brindan soporte para un arreglo de strings.
MongoDB Search no incluye un tipo de campo para la indexación de valores nulos porque MongoDB Search indexa automáticamente los valores nulos tanto para campos indexados de forma estática como dinámica.
Obsoleto. Para aprender más sobre los tipos de campo de faceta obsoletos y sus contrapartes actualizadas, se puede consultar Comparación de tipos de campo para facetas.
Arreglo de valores de double o int.
Nota
Puede almacenar campos de todos los tipos de datos soportados en MongoDB Búsqueda usando la opción storedSource.
Ejemplos
Los siguientes ejemplos utilizan la colección sample_mflix.movies para demostrar cómo configurar los campos para indexar usando mapeos dinámicos y estáticos. Si carga los datos de muestra, se pueden crear estos índices en la colección. Para aprender a crear índices de búsqueda de MongoDB, se puede consultar Inicio rápido de MongoDB Search.
Ejemplos de mapeo dinámico
Los siguientes ejemplos de definición de índices demuestran mapeos dinámicos.
La siguiente definición de índice configura mapeos dinámicos para los tipos de campos especificados. Indexa:
Todos los valores numéricos de la colección como el tipo de campo
numberutilizando la configuración por defecto para ese tipo.Todos los valores de string en la colección como el tipo
autocompleteutilizando la estrategia de tokenizaciónedgeGramcon un mínimo de cuatro y un máximo de diez caracteres por token.
{ "mappings": { "dynamic": { "typeSet": "movieFieldTypes" } }, "typeSets": [ { "name": "movieFieldTypes", "types": [ { "type": "number" }, { "type": "autocomplete", "analyzer": "lucene.standard", "tokenization": "edgeGram", "minGrams": 4, "maxGrams": 10 } ] } ] }
Esta definición de índice:
Especifica el analizador de índices por defecto como lucene.standard.
Especifica el analizador de búsqueda por defecto como lucene.standard. Se puede cambiar el analizador de búsqueda si se desea que el término de query se analice de manera diferente a cómo está almacenado en el índice de MongoDB Search.
Configurar la indexación automática de todos los campos
stringen el nivel raíz como los siguientes tipos de campo utilizando eltypeSetllamadofirst:tokenescribir usando la configuración por defecto para el tipo.autocompleteescribir usando la configuración por defecto para el tipo.
Especifica la asignación estática para el documento
awards, que contiene campos con valores numéricos y de texto. Sin embargo, la definición del índice configura la indexación automática solo de los campos de tiponumberen el documento utilizando eltypeSetllamadosecond.
{ "mappings": { "dynamic": { "typeSet": "first" }, "fields": { "awards": { "type": "document", "dynamic": { "typeSet": "second" } } } }, "typeSets": [ { "name": "first", "types": [ { "type": "token" }, { "type": "autocomplete" } ] }, { "name": "second", "types": [ { "type": "number" } ] } ] }
Esta definición de índice:
Especifica el analizador de índices por defecto como lucene.standard.
Especifica el analizador de búsqueda por defecto como lucene.standard. Se puede cambiar el analizador de búsqueda si se desea que el término de query se analice de manera diferente a cómo está almacenado en el índice de MongoDB Search.
Configura asignaciones dinámicas para tipos de campos específicos utilizando el
typeSetdenominadoindexedTypes, que especifica el siguiente comportamiento:Indexa automáticamente los campos de tipo
stringcomo tipotoken.Indexa automáticamente los campos de tipo
numbercomo tiponumber.
Excluir el campo
plotde ser indexado.
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": { "typeSet": "indexedTypes" }, "fields": { "plot": [] } }, "typeSets": [ { "name": "indexedTypes", "types": [ { "type": "token" }, { "type": "number" } ] } ] }
Ejemplo de asignación estática
El siguiente ejemplo de definición de índice demuestra mapeos estáticos.
Especifica el analizador de índices por defecto como lucene.standard.
Especifica el analizador de búsqueda por defecto como lucene.standard. Se puede cambiar el analizador de búsqueda si se desea que el término de query se analice de manera diferente a cómo está almacenado en el índice de MongoDB Search.
Especifica las asignaciones de campos estáticas (
dynamic:false), lo que significa que los campos que no se mencionan explícitamente no se indexan. Por lo tanto, la definición del índice incluye:El campo
awards, que es de tipodocument. Tiene tres subcampos incrustados,wins,nominationsytext.Los subcampos
winsynominationsutilizan el analizador lucene.standard por defecto para los queries. MongoDB Search usa índices de búsqueda para indexar valoresint64en el camponominations.El subcampo
textutiliza el analizador lucene.english por defecto para los queries. Utiliza la opciónignoreAbovepara ignorar cualquier string de más de 255 bytes de longitud.El campo
title, que es de tipostring. Utiliza el analizador lucene.whitespace por defecto para las queries. Tiene un analizadormultillamadomySecondaryAnalyzerque utiliza el analizador lucene.french por defecto para las queries.El campo
genres, que es un arreglo de strings de texto. Utiliza el analizador lucene.standard por defecto para los queries. Para la indexación de arreglos, MongoDB Search solo requiere el tipo de dato de los elementos del arreglo. No es necesario especificar que los datos están contenidos en un arreglo en la definición del índice.
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "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": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "genres": { "type": "string", "analyzer": "lucene.standard" } } } }
Ejemplo de asignación combinada
Los siguientes ejemplos de definiciones de índices combinan mapeos dinámicos con mapeos estáticos.
Esta definición de índice:
Especifica el analizador de índices por defecto como lucene.standard.
Especifica el analizador de búsqueda por defecto como lucene.standard. Se puede cambiar el analizador de búsqueda si se desea que el término de query se analice de manera diferente a cómo está almacenado en el índice de MongoDB Search.
Especifica asignaciones de campos estáticos (
dynamic:false), lo que significa que los campos y los tipos de campos que no se mencionan explícitamente no se indexan. Por lo tanto, la definición del índice incluye:El campo
title, que es de tipostring. Utiliza el analizador lucene.whitespace por defecto para las queries. Tiene un analizadormultillamadomySecondaryAnalyzerque utiliza el analizador lucene.french por defecto para las queries.El campo
genres, que es un arreglo de strings. Utiliza el analizador lucene.standard por defecto para las queries.El campo
awards, que es de tipodocument. Tiene tres subcampos incrustados,wins,nominationsytext. En lugar de mencionar explícitamente cada campo anidado en el documento, la definición del índice permite el mapeo dinámico de todos los subcampos en el documento. Utilizar el analizador lucene.standard por defecto para los queries.
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "title": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "genres": { "type": "string", "analyzer": "lucene.standard" }, "awards": { "type": "document", "dynamic": true } } } }
Esta definición de índice:
Especifica el analizador de índices por defecto como lucene.standard.
Especifica el analizador de búsqueda por defecto como lucene.standard. Se puede cambiar el analizador de búsqueda si se desea que el término de query se analice de manera diferente a cómo está almacenado en el índice de MongoDB Search.
Especifica asignaciones de campos estáticos (
dynamic:false), lo que significa que los campos y los tipos de campos que no se mencionan explícitamente no se indexan. Por lo tanto, la definición del índice incluye solo el campoawards, que es de tipodocument.El campo
awardstiene tres subcampos incrustados,wins,nominationsytext. En lugar de mediante la indexación automática de todos los campos del documento estableciendo explícitamentedynamicentrueo mediante indexación explícita de cada campo anidado del documento utilizando mapeos estáticos, la definición del índice configura mapeos dinámicos para el tipo de campodocumentutilizando la definición de tipos de campo denominadamovieAwards:Indexar campos de tipo
stringutilizando tanto los analizadoreslucene.englishcomolucene.french.Indexar campos de tipo
numberutilizando la configuración por defecto para el tiponumber.Indexar los campos de tipo
stringy también de tipoautocompleteutilizando la estrategia de tokenizaciónedgeGrampara crear tokens de entre tres y cinco caracteres de longitud.{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "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" }, { "type": "autocomplete", "analyzer": "lucene.standard", "tokenization": "edgeGram", "minGrams": 3, "maxGrams": 5, "foldDiacritics": false } ] } ] }
En esta definición de índice:
El analizador por defecto del índice es lucene.standard.
El analizador de búsqueda por defecto es lucene.standard. Se puede cambiar el analizador de búsqueda si se desea que el término de query se analice de manera diferente a cómo está almacenado en el índice de MongoDB Search.
El índice especifica mapeos dinámicos para los tipos de campo definidos en la definición
typeSetllamadafirst. La definición defirsttypeSetindexa todos los campos de tipostringcomo el tipotokeny todos los campos de tiponumbercomo el tiponumberutilizando la configuración por defecto para los tipos de campo.La definición del índice especifica asignaciones estáticas para el campo
awards, pero configura asignaciones dinámicas para los campos en el documentoawardsutilizando eltypeSetllamadosecond. La definición del tipo de camposecondindexa todos los campos de tipostringen el documentoawardscomo tipoautocompleteusando la configuración por defecto para ese tipo.
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": { "typeSet": "first" }, "fields": { "awards": { "type": "document", "dynamic": { "typeSet": "second" } } } }, "typeSets": [ { "name": "first", "types": [ { "type": "token" }, { "type": "number" } ] }, { "name": "second", "types": [ { "type": "autocomplete" } ] } ] }