Nota
Esta página describe las funciones de consulta de texto para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de consulta de texto completo, Atlas Search, y una solución de búsqueda vectorial, Atlas Vector Search.
Esta página describe el $text Operador para implementaciones autogestionadas.
Definición
$text$textrealiza una consulta de texto sobre el contenido de los campos indexados con un índice de texto.
Compatibilidad
Puedes usar $text para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
Una expresión $text tiene la siguiente sintaxis:
{ $text: { $search: <string>, $language: <string>, $caseSensitive: <boolean>, $diacriticSensitive: <boolean> } }
El operador $text acepta un documento de query de texto con los siguientes campos:
Campo | Tipo | Descripción |
|---|---|---|
| string | Una string de términos que MongoDB analiza y utiliza para hacer una query al índice de texto. MongoDB realiza una query |
| string | Opcional. El lenguaje que determina la lista de palabras irrelevantes para el query y las reglas para el lematizador y el tokenizador. Si no se especifica, MongoDB utiliza el idioma por defecto del índice. Para conocer los idiomas admitidos, consulta Idiomas de búsqueda de texto en implementaciones autogestionadas. Si especificas un valor |
| booleano | Opcional. Un indicador booleano para activar o desactivar la distinción entre mayúsculas y minúsculas. Se establece en Para obtener más información, consulta Sin distinción entre mayúsculas y minúsculas. |
| booleano | Opcional. Un indicador booleano para activar o desactivar la distinción de diacríticas en los índices de texto de la versión 3. Se establece en Las queries de texto respecto a versiones anteriores del índice del texto distinguen diacríticas inherentemente y esto no se pueden anular. Por lo tanto, la opción Para obtener más información, consulta Sin distinción de diacríticas. |
El operador $text por defecto no devuelve los resultados ordenados según las puntuaciones de los resultados. Para obtener más detalles sobre la clasificación por puntuación de los resultados, consulta la documentación de Puntuación del texto.
Comportamiento
Restricciones
Un query puede especificar, como máximo, una expresión
$text.$textno puede aparecer en expresiones$nor.$textno puede aparecer en expresiones de query$elemMatcho expresiones de proyección$elemMatch.Para usar
$texten una expresión$or, todas las cláusulas del arreglo$ordeben estar indexadas.Si un query incluye una expresión
$text, no se puede usarhint()para especificar qué índice usar para el query.No puedes especificar el orden de clasificación
$naturalsi el query incluye una expresión$text.No se puede combinar la expresión
$text, que requiere un índice de texto especial, con un operador del query que requiera un tipo diferente de índice especial. Por ejemplo, no se puede combinar la expresión$textcon el operador$near.Las vistas no son compatibles con
$text.$textno es compatible para la creación de índices utilizando Stable API v1.
Si se utiliza el operador $text en la agregación, también se aplican las siguientes restricciones.
La etapa
$matchque incluye un$textdebe ser la primera etapa en el pipeline.Un operador
$textsolo puede ocurrir una vez en la etapa.La expresión del Operador
$textno puede aparecer en$orni en$not.$text, por defecto, no devuelve los documentos coincidentes en el orden de las puntuaciones de coincidencia. Para ordenar por puntuación descendente, utiliza la expresión de agregación$metaen la etapa$sort.
$search Campo
En el campo $search, especifica un string de palabras que el operador $text analiza y utiliza para realizar un query al índice de texto.
El operador $text trata la mayoría de los signos de puntuación en la string como delimitadores, excepto un guion-menos (-) que niega un término o unas comillas double con escape \" que especifican una string exacta.
Nota
El campo $search para la expresión $text es diferente de la etapa de agregación $search proporcionada por Atlas Search. La etapa de agregación $search realiza una búsqueda de texto completo en campos especificados y solo está disponible en MongoDB Atlas.
Cadenas exactas
Para coincidir con una string exacta de varias palabras, en lugar de términos individuales, escribe la string entre comillas dobles con escape (\"), como en:
"\"ssl certificate\""
Si la string $search de una operación $text incluye una string de varias palabras y términos individuales, $text solo coincide con los documentos que incluyan la string de varias palabras.
Por ejemplo, la siguiente string $search devuelve documentos que incluyen la string exacta "ssl certificate":
"\"ssl certificate\" authority key"
Negaciones
Prefijar una palabra con un guion-menos (-) niega una palabra:
La palabra negada excluye los documentos que la contienen del conjunto de resultados.
Cuando se pasa un string que solo contiene palabras negadas,
$textno coincide con ningún documento.Una palabra con guion, como
pre-market, no es una negación. Si se utiliza en una palabra con guion, el operador$textconsidera el guion-menos (-) como un delimitador. Para negar la palabramarketen esta instancia, incluye un espacio entreprey-market, es decir,pre -market.
El operador $text agrega todas las negaciones a la operación con el operador lógico AND.
Operación de coincidencia
Palabras irrelevantes
El operador $text ignora las palabras de parada específicas del idioma, como the y and en inglés.
Palabras lematizadas
Cuando no utilizas la distinción entre mayúsculas y minúsculas y la distinción de diacríticas, el operador $text busca coincidencias con la palabra lematizada completa. Si un campo de documento contiene la palabra blueberry, la operación $text con un término $search de blue no coincide. Sin embargo, blueberry o blueberries coinciden.
Sensibilidad a mayúsculas y minúsculas y palabras lematizadas
Cuando usas la distinción entre mayúsculas y minúsculas ($caseSensitive: true), si la raíz del sufijo contiene letras mayúsculas, el operador $text coincide con la palabra exacta.
Distinción de diacríticas y palabras lematizadas
Cuando usas la distinción de diacríticas ($diacriticSensitive: true), si la raíz del sufijo contiene las marcas diacríticas, el operador $text busca coincidencias con la palabra exacta.
Insensibilidad a las mayúsculas y minúsculas
El operador $text por defecto no distingue entre mayúsculas y minúsculas en el índice de texto:
La versión 3 del índice de texto no distingue entre mayúsculas y minúsculas para caracteres latinos con o sin diacríticas y caracteres de alfabetos no latinos, como el alfabeto cirílico. Consulta el índice de texto para más detalles.
Las versiones anteriores del índice
textson insensibles a mayúsculas y minúsculas para los caracteres latinos sin marcas diacríticas; es decir, para[A-z].
$caseSensitive Opción
Para dar soporte a la distinción entre mayúsculas y minúsculas donde el índice text distinga entre mayúsculas y minúsculas, especifica $caseSensitive: true.
Proceso de sensibilidad a los casos
Si $caseSensitive: true y el índice text no distingue entre mayúsculas y minúsculas, el operador $text:
Primero realiza queries del índice
textpara coincidencias que no distinguen entre mayúsculas y minúsculas ni diacríticas.Luego, para devolver solo los documentos que coinciden con las mayúsculas y minúsculas de los términos especificados, la operación
$textincluye una etapa adicional para filtrar los documentos que no coinciden con las mayúsculas y minúsculas especificadas.
Si $caseSensitive: true y si la raíz del sufijo contiene letras mayúsculas, el operador $text coincide exactamente con la palabra.
La especificación de $caseSensitive: true puede afectar el rendimiento.
Insensibilidad a los diacríticos
El operador $text por defecto es insensible a los diacríticos en el índice de texto:
La versión 3 del índice de texto no distingue diacríticas. Es decir, el índice no distingue entre caracteres que contienen signos diacríticos y sus contrapartes no marcadas, como
é,êye.Las versiones anteriores del índice
textdistinguen diacríticas.
$diacriticSensitive Opción
Para admitir la distinción de diacríticas con el índice text, especifica $diacriticSensitive: true.
Los queries de texto respecto a versiones anteriores del índice de text distinguen diacríticas inherentemente y esto no se pueden anular. Por lo tanto, la opción $diacriticSensitive para el operador $text no tiene efecto con versiones anteriores del índice text.
Proceso de sensibilidad a los diacríticos
Para usar la distinción de diacríticas ($diacriticSensitive: true) con un índice text de versión 3, el operador $text:
Primero realiza queries en el índice
text, que no distingue entre diacríticas.Luego, para devolver solo los documentos que coinciden con los caracteres marcados con diacríticas de los términos especificados, la operación
$textincluye una etapa adicional para filtrar los documentos que no coinciden.
La especificación de $diacriticSensitive: true puede afectar el rendimiento.
Si usas $diacriticSensitive: true con una versión anterior del índice text, el operador $text consulta el índice text, que distingue diacríticas.
Si $diacriticSensitive: true y si la raíz del sufijo contiene el signo o los signos diacríticos, el operador $text busca coincidencias con la palabra exacta.
Puntuación del texto
El operador $text asigna una puntuación a cada documento de resultado. La puntuación representa la relevancia de un documento para un query determinado. La puntuación puede ser parte de una especificación de un método sort(), así como parte de la expresión de proyección. La expresión { $meta: "textScore" } proporciona información sobre el procesamiento de la operación $text. Consulta el operador de proyección $meta para obtener detalles sobre cómo acceder a la puntuación para proyección o clasificación.
Ejemplos
Los siguientes ejemplos suponen una colección articles que tiene un índice 3 de texto de versión en el subject campo:
db.articles.createIndex( { subject: "text" } )
Rellena la colección con los siguientes documentos:
db.articles.insertMany( [ { _id: 1, subject: "coffee", author: "xyz", views: 50 }, { _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 }, { _id: 3, subject: "Baking a cake", author: "abc", views: 90 }, { _id: 4, subject: "baking", author: "xyz", views: 100 }, { _id: 5, subject: "Café Con Leche", author: "abc", views: 200 }, { _id: 6, subject: "Сырники", author: "jkl", views: 80 }, { _id: 7, subject: "coffee and cream", author: "efg", views: 10 }, { _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 } ] )
$text con una sola palabra
El siguiente ejemplo especifica un string $search de coffee:
db.articles.find( { $text: { $search: "coffee" } } )
Esta operación devuelve los documentos que contienen el término coffee en el campo subject indexado, o más precisamente, la versión con raíz de la palabra:
{ _id: 1, subject: 'coffee', author: 'xyz', views: 50 }, { _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 }, { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 }
Coincide con cualquiera de los $search términos
Si el string $search es un string separado por espacio, $text realiza una operación OR lógica en cada término y devuelve documentos que contienen cualquiera de los términos.
El siguiente ejemplo especifica un string $search de tres términos delimitados por espacio, "bake coffee cake":
db.articles.find( { $text: { $search: "bake coffee cake" } } )
Esta operación devuelve documentos que contienen bake o coffee o cake en el campo indexado subject, o más precisamente, la versión lematizada de estas palabras:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 } { "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 } { "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 } { "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90 } { "_id" : 4, "subject" : "baking", "author" : "xyz", "views" : 100 }
$text con una string exacta
Para hacer coincidir una string exacta de varias palabras como un único término, evita las comillas.
El siguiente ejemplo coincide con la string exacta coffee shop:
db.articles.find( { $text: { $search: "\"coffee shop\"" } } )
Esta operación devuelve documentos que contienen la string coffee shop:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
El siguiente ejemplo coincide con las strings coffee shop y Cafe
con Leche. Esto es una operación OR lógica de las dos strings.
db.articles.find( { $text: { $search: "\'coffee shop\' \'Cafe con Leche\'" } } )
Esta operación devuelve documentos que contienen ambas strings, incluidos aquellos que contienen términos de ambas strings:
[ { _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 }, { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 }, { _id: 1, subject: 'coffee', author: 'xyz', views: 50 }, { _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 }, { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]
Excluir documentos que contengan un término
Un término negado es un término que está precedido por un signo menos -. Si niegas un término, el operador $text excluye los documentos que contienen esos términos de los resultados.
El siguiente ejemplo coincide con documentos que contienen la palabra coffee pero no contienen el término shop, o más precisamente, la versión lematizada de las palabras:
db.articles.find( { $text: { $search: "coffee -shop" } } )
La operación devuelve los siguientes documentos:
{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 } { "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }
Query en otro idioma
Usa el campo $language opcional en la expresión $text para especificar un idioma que determine la lista de palabras irrelevantes y las reglas para el lematizador y el tokenizador del string $search.
Si especificas un valor default_language de none, el índice de texto analiza cada palabra en el campo, incluidas las palabras irrelevantes, e ignora la lematización de sufijos.
El siguiente ejemplo especifica es, es decir, español, como el idioma que determina la tokenización, la lematización y las palabras irrelevantes:
db.articles.find( { $text: { $search: "leche", $language: "es" } } )
El ejemplo devuelve los siguientes documentos:
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 } { "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10 }
La expresión $text también puede aceptar el idioma por su nombre, spanish. Consulta Idioma de búsqueda de texto en implementaciones autogestionadas para conocer los idiomas admitidos.
Insensibilidad a mayúsculas y diacríticos
El operador $text se remite a la insensibilidad a mayúsculas, minúsculas y diacríticos del índice text. El índice 3 text de la versión es insensible a los signos diacríticos y amplía su insensibilidad a las mayúsculas y minúsculas para incluir el alfabeto cirílico y los caracteres con diacríticos. Para obtener más detalles, consulte Insensibilidad del índice de texto a mayúsculas y minúsculas y Insensibilidad del índice de texto a los diacríticos.
El siguiente ejemplo realiza un query de texto que no distingue entre mayúsculas y minúsculas ni diacríticas para los términos сы́рники o CAFÉS:
db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )
Al usar la versión 3 del índice text, la operación busca coincidencias con los siguientes documentos.
{ "_id" : 6, "subject" : "Сырники", "author" : "jkl", "views" : 80 } { "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 } { "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz", "views" : 10 }
Con versiones anteriores del índice text, la query no coincidía con ningún documento.
Distinción entre mayúsculas y minúsculas
Para activar la sensibilidad a mayúsculas y mayúsculas, especifica $caseSensitive: true. Al especificar $caseSensitive: true, el rendimiento podría verse afectado
Distinción entre mayúsculas y minúsculas con un término
El siguiente ejemplo realiza un query que distingue entre mayúsculas y minúsculas para el término Coffee:
db.articles.find( { $text: { $search: "Coffee", $caseSensitive: true } } )
La operación coincide solo con el siguiente documento:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
Distinción entre mayúsculas y minúsculas con una string exacta
El siguiente ejemplo realiza un query que distingue entre mayúsculas y minúsculas para la string de varias palabras Café Con Leche:
db.articles.find( { $text: { $search: "\"Café Con Leche\"", $caseSensitive: true } } )
La operación coincide solo con el siguiente documento:
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }
Distinción entre mayúsculas y minúsculas con un término negado
Un término negado es un término precedido por un signo menos -. Si niegas un término, el operador $text excluirá los documentos que contengan esos términos de los resultados. También puedes especificar la distinción entre mayúsculas y minúsculas para términos negados.
El siguiente ejemplo realiza un query distingue entre mayúsculas y minúsculas para documentos que contienen la palabra Coffee pero no contienen el término en minúscula shop, o más precisamente la versión derivada de las palabras:
db.articles.find( { $text: { $search: "Coffee -shop", $caseSensitive: true } } )
La operación coincide con el siguiente documento:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg" }
Distinción de diacríticas
Para habilitar la sensibilidad a los diacríticos con un índice de texto de la versión 3, especifique $diacriticSensitive: true. La especificación de $diacriticSensitive: true puede afectar el rendimiento.
Distinción de diacríticas con un término
El siguiente ejemplo realiza un query de texto que distingue diacríticas en el término CAFÉ, o más precisamente la versión lematizada de la palabra:
db.articles.find( { $text: { $search: "CAFÉ", $diacriticSensitive: true } } )
La operación solo coincide con el siguiente documento:
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc" }
Sensibilidad a los diacríticos con término negado
La opción $diacriticSensitive también se aplica a los términos negados. Un término negado es un término que está precedido por un signo menos -. Si niegas un término, el operador $text excluirá los documentos que contengan esos términos de los resultados.
El siguiente ejemplo realiza un query de texto que distingue diacríticas para documentos que contienen el término leches pero no el término cafés, o más precisamente la versión lematizada de las palabras:
db.articles.find( { $text: { $search: "leches -cafés", $diacriticSensitive: true } } )
La operación coincide con el siguiente documento:
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }
Ejemplos de puntuación de relevancia
Devuelva la puntuación de relevancia
En el siguiente ejemplo, se realiza un query de texto para el término cake y utiliza el operador $meta en el documento de proyección para añadir la puntuación de relevancia a cada documento coincidente:
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } )
El documento devuelto incluye un campo adicional score que contiene la puntuación de relevancia del documento:
{ "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90, "score" : 0.75 }
Tip
Ordenar por puntuación de relevancia
Puedes especificar la expresión
{ $meta: "textScore" }ensort()sin especificar también la expresión en la proyección. Por ejemplo:db.articles.find( { $text: { $search: "cake" } } ).sort( { score: { $meta: "textScore" } } ) Como resultado, se pueden ordenar los documentos resultantes por su relevancia sin proyectar el
textScore.Si incluyes la expresión
{ $meta: "textScore" }tanto en la proyección como en elsort(), los documentos de proyección y orden pueden tener nombres de campo diferentes para la expresión.For example, in the following operation, the projection uses a field namedscorefor the expression and thesort()uses the field namedignoredName.db.articles.find( { $text: { $search: "cake" } } , { score: { $meta: "textScore" } } ).sort( { ignoredName: { $meta: "textScore" } } )
Tip
Devolver los 2 documentos coincidentes principales
Utilice el método limit() en conjunto con un sort() para devolver los n documentos más coincidentes.
El siguiente ejemplo realiza un query del término coffee y ordena los resultados por calificación descendente, limitando los resultados a los dos documentos que más coinciden:
db.articles.find( { $text: { $search: "coffee" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } ).limit(2)
Tip
$text con expresiones de query y clasificación adicionales
El siguiente ejemplo coincide con documentos donde author es igual a "xyz" y el campo indexado subject contiene los términos coffee o bake. La operación también especifica un orden de clasificación de date ascendente y, luego, una puntuación de relevancia descendente:
db.articles.find( { author: "xyz", $text: { $search: "coffee bake" } }, { score: { $meta: "textScore" } } ).sort( { date: 1, score: { $meta: "textScore" } } )