Definición
El operador text realiza una búsqueda de texto completo utilizando el analizador que especifiques en la configuración del índice. Si omites un analizador, el operador text utiliza el analizador estándar por defecto.
Puede utilizar el operador text para buscar coincidencias exactas con términos de una sola palabra.
Sintaxis
text tiene la siguiente sintaxis:
{ $search: { "index": <index name>, // optional, defaults to "default" "text": { "query": "<search-string>", "path": "<field-to-search>", "fuzzy": <options>, "matchCriteria": "any" | "all" "score": <options>, "synonyms": "<synonyms-mapping-name>" } } }
opciones
text utiliza los siguientes términos para construir una query:
Campo | Tipo | Descripción | Necesidad |
|---|---|---|---|
| string o arreglo de strings | La o las cadenas que se deben buscar. Si hay varios términos en una string, la búsqueda en MongoDB Search también busca una coincidencia para cada término de la string por separado. | Requerido |
| string o arreglo de strings | El campo o los campos indexados a buscar. También se puede especificar una ruta comodín para realizar una búsqueda. | Requerido |
| Documento | Habilita la búsqueda difusa. Encuentre cadenas que sean similares al término o términos de búsqueda. No puedes utilizar | Opcional |
| entero | El número máximo de ediciones de un solo carácter requeridas para coincidir con el término de búsqueda especificado. El valor puede ser | Opcional |
| entero | Número de caracteres al inicio de cada término en el resultado que deben coincidir exactamente. El valor por defecto es | Opcional |
| entero | Número máximo de variaciones a generar y buscar. Este límite se aplica a cada token. El valor por defecto es | Opcional |
| string | Criterios a utilizar para hacer coincidir los términos en la query. Si se omite, el valor por defecto es
| Opcional, recomendado |
| Documento | Puntuación asignada a los resultados de términos de búsqueda coincidentes. Utiliza una de las siguientes opciones para modificar el puntaje:
Cuando se consultan valores en arreglos, MongoDB Search asigna mayores puntuaciones si más valores en el arreglo coinciden con la query. | Opcional |
| string | Es necesario para ejecutar queries utilizando synonyms. Nombre de la definición de asignación de sinónimos en la definición de índice. El valor no puede ser una cadena vacía. No puedes usar IMPORTANTE: Para usar la opción Siempre usa La cantidad de tiempo que MongoDB Search tarda en ejecutar consultas que utilizan mapeos de sinónimos depende de la cantidad y tamaño de los documentos en la colección fuente de sinónimos. Una query que utiliza un mapeo de sinónimos basado en muy pocos documentos de sinónimos podría ser más rápida que una query que utiliza un mapeo de sinónimos basado en muchos documentos de sinónimos. | Opcional |
Comportamiento de la puntuación
Por defecto, el texto operador utiliza el algoritmo de similitud bm25 para puntuar los documentos según su relevancia con respecto a la query.
Puede cambiar el algoritmo de similitud que se utiliza especificando un algoritmo de similitud diferente en la propiedad similarity.type para los campos string en su definición de índice de MongoDB Search. Para aprender a configurar un índice de MongoDB Search para el tipo string, se puede consultar Cómo indexar campos de string.
Para obtener más información sobre los algoritmos de similitud admitidos, consulta Detalles de la puntuación.
Comportamiento
Para las text queries que utilizan synonyms sin matchCriteria, MongoDB Search sólo coincide con los documentos que contienen una coincidencia exacta de los términos de la query (con o sin los sinónimos expandidos).
Este comportamiento puede cambiar en el futuro y tus resultados de consulta también pueden cambiar. Para evitar interrupciones en el servicio, siempre usa matchCriteria cuando utilices synonyms. O utiliza sinónimos con el operador frase.
Por ejemplo, suponga que existen asignaciones de sinónimos equivalentes para nyc y new york city. Una búsqueda de i like nyc devuelve lo siguiente:
Especificación del Operador | Comportamiento por defecto | "matchCriteria": "any" | "matchCriteria": "all" |
|---|---|---|---|
| Coincide con | Coincide con | Coincidencias |
| Coincide con | Coincide con | Coincide con |
La cantidad de tiempo que MongoDB Search tarda en ejecutar consultas que utilizan mapeos de sinónimos depende de la cantidad y tamaño de los documentos en la colección fuente de sinónimos. Una query que utiliza un mapeo de sinónimos basado en muy pocos documentos de sinónimos podría ser más rápida que una query que utiliza un mapeo de sinónimos basado en muchos documentos de sinónimos.
Ejemplos
Los ejemplos de esta página usan la colección movies en la base de datos sample_mflix. Después de cargar el dataset de muestra en el clúster, crea el índice MongoDB Search con mapeos dinámicos y ejecuta las consultas de ejemplo en el clúster. También debes definir una colección de mapeo synonyms en el índice como se muestra en el Ejemplo de definición de índices para probar los siguientes ejemplos de sinónimos.
Ejemplo básico
La siguiente query de búsqueda de MongoDB Search utiliza el operador text para buscar el campo title en la colección movies el término surfer. Incluye una etapa de $project para:
Excluir todos los campos excepto
titleAñade un campo llamado
score
db.movies.aggregate([ { $search: { "text": { "path": "title", "query": "surfer" } } }, { $project: { "_id": 0, "title": 1, score: { $meta: "searchScore" } } } ])
Ejemplo de metadatos
La siguiente consulta busca el campo title por el término summer. Usa la etapa $searchMeta para recuperar el número de películas en los siguientes grupos (años) que coinciden con los criterios de búsqueda:
1970, límite inferior inclusivo para este intervalo
1980, límite superior exclusivo para el cubo 1970 y límite inferior inclusivo para este cubo
1990, límite superior exclusivo para el cubo 1980 y límite inferior inclusivo para este cubo
2000, límite superior exclusivo para el cubo 1990 y límite inferior inclusivo para este cubo
2010, límite superior exclusivo para el cubo 2000 y límite inferior inclusivo para este cubo
2015, límite superior exclusivo para el intervalo 2010
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "text": { "path": "title", "query": "summer" } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [1970, 1980, 1990, 2000, 2010, 2020 ] } } } } } ])
Ejemplos aproximados
Las siguientes consultas usan el operador text para buscar en el campo title de la colección movies términos que estén a una variante de carácter de cada término de la frase query naw yark. MongoDB Search devuelve diferentes resultados dependiendo de si usas las opciones fuzzy por defecto o defines los campos maxExpansions, prefixLength o maxEdits.
Haz clic en las siguientes pestañas para ver ejemplos de queries que utilizan opciones por defecto y especificadas:
La siguiente consulta busca la frase naw yark en el campo title. Utiliza las opciones por defecto de fuzzy donde:
maxEditspermite hasta dos variaciones de caracteres para cada término en la frase dada, lo que permite que la query coincida con un documento.maxExpansionsconsidera hasta cincuenta términos similares para cada término ennaw yarkpara encontrar coincidencias.prefixLengthestá desactivado.
La query también incluye una $limit etapa para limitar la salida a 10 resultados y una $project etapa para:
Excluir todos los campos excepto
titleAñade un campo llamado
score
db.movies.aggregate([ { $search: { "text": { "path": "title", "query": "naw yark", "fuzzy": {} } } }, { $limit: 10 }, { $project: { "_id": 0, "title": 1, score: { $meta: "searchScore" } } } ])
La siguiente consulta busca en el campo title términos que estén a un carácter de distancia de cada término en la string naw yark. Usa:
El campo
maxEditspara indicar que solo se permite una variación de carácter para cada término con el fin de coincidir la query con un documento.El campo
maxExpansionspara indicar que hasta cien términos similares paranawy cien términos similares parayarkdeben ser considerados al hacer coincidir la query con un documento.
La query también incluye una $limit etapa para limitar la salida a 10 resultados y una $project etapa para:
Excluir todos los campos excepto
titleAñade un campo llamado
score
db.movies.aggregate([ { $search: { "text": { "path": "title", "query": "naw yark", "fuzzy": { "maxEdits": 1, "maxExpansions": 100, } } } }, { $limit: 10 }, { $project: { "_id": 0, "title": 1, score: { $meta: "searchScore" } } } ])
La siguiente consulta busca en el campo title términos que estén a un carácter de distancia de cada término en la string naw yark. Usa:
El campo
maxEditspara indicar que solo se permite una variación de carácter para que coincida con la query de un documento.El campo
prefixLengthpara indicar que los dos primeros caracteres de cada término en la stringnaw yarkno deben alterarse para hacer que la query coincida con un documento.
La query también incluye una $limit etapa para limitar la salida a 8 resultados y una $project etapa para:
Excluir todos los campos salvo
_idytitleAñade un campo llamado
score
db.movies.aggregate([ { $search: { "text": { "path": "title", "query": "naw yark", "fuzzy": { "maxEdits": 1, "prefixLength": 2, } } } }, { $limit: 8 }, { $project: { "_id": 1, "title": 1, score: { $meta: "searchScore" } } } ])
coincidencia all
La consulta siguiente utiliza el operador text para buscar el campo plot de la colección movies para todos los términos de la string del query automobile race.
db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "automobile race", "matchCriteria": "all" } } }, { "$limit": 20 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } } ])
[ { plot: 'A young driver, Speed Racer, aspires to be champion of the racing world with the help of his family and his high-tech Mach 5 automobile.', title: 'Speed Racer', score: 6.122188568115234 }, { plot: 'A gorgeous young automobile fanatic--and front to the hottest unsigned band on the West coast--finds herself caught up in illegal drag-racing competitions organized by exotic car fanatics.', title: 'Redline', score: 5.497724533081055 }, { plot: 'When a popular daredevil proposes an automobile race across three continents, his arch rival vows to beat him, while an ambitious female reporter has her own plans for victory.', title: 'The Great Race', score: 5.282209396362305 } ]
MongoDB Search devuelve documentos que contienen los términos automobile y race en cualquier parte del campo plot.
Ejemplos de sinónimos
Los siguientes ejemplos utilizan el operador text para buscar en el campo plot en el namespace sample_mflix.movies . MongoDB Search devuelve resultados basados en el tipo de mapeo de la colección de origen de sinónimos, synonymous_terms, especificado en la definición de mapeo de sinónimos del índice para la colección sample_mflix.movies.
Emparejar any usando la asignación equivalent
La siguiente consulta busca la frase attire en el campo plot. Utiliza el mapeo de sinónimos llamado mySynonyms en el índice de la colección para buscar también las palabras que están configuradas como sinónimos de la palabra dress.
db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "attire", "synonyms": "my_synonyms", "matchCriteria": "any" } } }, { "$limit": 5 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } } ])
MongoDB Search devuelve los documentos que contienen los términos attire, apparel y dress porque configuramos todos estos términos como equivalent sinónimos en la colección fuente de sinónimos synonymous_terms, lo que significa que todos estos términos son sinónimos entre sí. Por lo tanto, MongoDB Search devuelve documentos similares para búsquedas en dress y attire.
Emparejar any usando la asignación explicit
La siguiente query busca en el campo plot la frase boat race. Utiliza el mapeo de sinónimos llamado my_synonyms en el índice de la colección para también buscar palabras que estén configuradas como sinónimos de la palabra boat y race.
db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "boat race", "synonyms": "my_synonyms", "matchCriteria": "any" } } }, { "$limit": 10 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } } ])
MongoDB Search devuelve documentos que contienen el término boat, vessel, o sail, o race, rally o contest porque configuramos boat como un sinónimo de explicit o vessel y sail y configuramos race como un sinónimo de explicit de rally y contest. MongoDB Search no devuelve ningún resultado para una consulta en vessel y sail o rally y contest porque no configuramos estas palabras para que consideren a ninguna de las demás palabras como sinónimos.
Coincidencia de all utilizando sinónimos
La siguiente query utiliza el operador text para buscar en el campo plot de la colección movies todos los términos presentes en la string del query automobile race.
MongoDB Search devuelve resultados basados en el tipo de mapeo en la colección de origen de sinónimos, synonymous_terms, especificada en la definición de mapeo de sinónimos del índice para la colección sample_mflix.movies.
db.movies.aggregate([ { "$search": { "text": { "path": "plot", "query": "automobile race", "matchCriteria": "all", "synonyms": "my_synonyms" } } }, { "$limit": 20 }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { "$meta": "searchScore" } } } ])
MongoDB Search devuelve documentos que contienen los términos de consulta automobile, car o vehicle y race, context o rally, porque configuramos automobile, vehicle y car como sinónimos de equivalent y configuramos rally y contest como sinónimos de explicit de race en la colección synonymous_terms.