Nota
MongoDB ofrece una solución mejorada de búsqueda de texto completo, MongoDB Search, y la solución de búsqueda semántica, MongoDB Vector Search. Recomendamos utilizar el $search, $searchMeta, o $vectorSearch etapas, en lugar del operador $text.
Esta página describe el operador $text para las implementaciones autogestionadas.
Definición
$text$textrealiza una query de texto en 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 estos campos:
Campo | Tipo | Descripción |
|---|---|---|
| string | Una string de términos que MongoDB analiza y usa para consultar el índice de texto. MongoDB realiza una logical |
| string | opcional. El lenguaje que determina las palabras vacías, el stemmer y las reglas del tokenizador. Por defecto, es el lenguaje del índice. Para consultar los lenguajes compatibles, véase $text Lenguajes de consulta en implementaciones autogestionadas. Si especificas un valor |
| booleano | Opcional. Activa la sensibilidad a mayúsculas y minúsculas. Los valores por defecto son |
| booleano | Opcional. Habilita la sensibilidad diacrítica para los índices de texto de la versión 3. Se establece en |
Por defecto, $text no ordena los resultados por puntuación. Consulta Calificación del texto para obtener detalles sobre la ordenación de puntuaciones.
Comportamiento
Restricciones
Una query puede especificar solo una expresión
$text.$textno puede aparecer en expresiones$nor.$textno puede aparecer en$elemMatchquery o expresiones de proyección.Todas las cláusulas
$ordeben indexarse para utilizar$text.Si un query incluye una expresión
$text, no se puede usarhint()para especificar qué índice usar para el query.Las consultas con
$textno pueden usar$naturalorden.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.Stable API V1 no admite
$textpara la creación de índices.
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 las palabras que MongoDB utiliza para query el índice de texto.
Nota
El campo $search difiere del $search agregación stage de MongoDB Atlas. La etapa $search proporciona búsqueda de texto completo y está disponible solo 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, esta $search string devuelve documentos con la string exacta "ssl certificate":
"\"ssl certificate\" authority key"
Negaciones
Anteponga un guión (–) a una palabra- para negarla:
Las palabras negadas excluyen los documentos que contienen la palabra negada del conjunto de resultados.
Una string que contiene únicamente palabras negativas no coincide con ningún documento.
Las palabras con guion como
pre-marketno son negaciones. MongoDB trata el guion como un delimitador. Para negarmarket, utilizapre -market.
MongoDB aplica todas las negaciones a la operación con AND lógico.
Operación de coincidencia
Palabras irrelevantes
MongoDB ignora las palabras vacías específicas del lenguaje, como the y and en inglés.
Palabras lematizadas
Con insensibilidad a mayúsculas, minúsculas y diacríticos, $text coincide con toda la palabra reducida. Si un campo de documento contiene blueberry, un término $search de blue no coincide. Sin embargo, blueberry o blueberries sí coinciden.
Sensibilidad a mayúsculas y minúsculas y palabras lematizadas
Con la sensibilidad a mayúsculas y minúsculas activada ($caseSensitive: true), si el prefijo de sufijo contiene letras mayúsculas, $text coincide con la palabra exacta.
Distinción de diacríticas y palabras lematizadas
Con la sensibilidad a diacríticos habilitada ($diacriticSensitive: true), si la raíz del sufijo contiene signos diacríticos, $text coincide exactamente con la palabra.
Insensibilidad a las mayúsculas y minúsculas
$text establece por defecto la insensibilidad a mayúsculas y minúsculas del índice de texto:
La versión 3 índice de texto no distingue entre mayúsculas y minúsculas para caracteres latinos con o sin signos diacríticos y alfabetos no latinos como el cirílico.
En versiones anteriores, no se diferencia entre mayúsculas y minúsculas de caracteres latinos sin signos diacríticos (
[A-z]).
Activación de la sensibilidad a mayúsculas y minúsculas
Especifique $caseSensitive: true para habilitar la distinción entre mayúsculas y minúsculas cuando el índice de texto no distinga entre mayúsculas y minúsculas.
Proceso de sensibilidad a los casos
Cuando $caseSensitive: true y el índice de texto no distingue entre mayúsculas y minúsculas, $text:
Realiza consultas en el índice de texto para obtener coincidencias sin distinción entre mayúsculas y minúsculas ni de diacríticos.
Filtra los resultados para devolver únicamente los documentos que coincidan con el caso especificado.
Cuando $caseSensitive: true y el sufijo contiene letras mayúsculas, $text coincide con la palabra exacta.
Habilitar $caseSensitive: true puede disminuir el rendimiento.
Insensibilidad a los diacríticos
$text por defecto para la insensibilidad diacrítica del índice texto:
La versión 3 índice de texto no distingue entre mayúsculas y minúsculas. El índice no distingue entre caracteres con marcas diacríticas y sus contrapartes sin marcas (
é,ê,e).Las versiones anteriores son sensibles a los signos diacríticos.
Activar la sensibilidad a los diacríticos
Especifique $diacriticSensitive: true para habilitar la sensibilidad a diacríticos con índices de texto de la versión 3.
Las versiones anteriores del índice de texto siempre distinguen entre signos diacríticos, por lo que $diacriticSensitive no tiene efecto.
Proceso de sensibilidad a los diacríticos
Con los índices de texto de la versión 3 y $diacriticSensitive: true, $text:
Consulta el índice de texto insensible a los signos diacríticos.
Filtra los resultados para que devuelvan solamente documentos coincidentes con los signos diacríticos en los términos especificados.
Habilitar $diacriticSensitive: true puede disminuir el rendimiento.
Con las versiones anteriores del índice de texto, $diacriticSensitive: true consulta el índice de texto que ya es sensible a los signos diacríticos.
Cuando $diacriticSensitive: true y la raíz del sufijo contiene marcas diacríticas, $text coincide 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.
Límites de la memoria
Cambiado en la versión 8.3.
A partir de MongoDB 8.3, el motor de query limita el uso de memoria de la etapa TextOr a 100 megabytes. La etapa TextOr procesa $text queries que leen los metadatos de las puntuaciones del text. Por ejemplo, TextOr procesa que ordenan los resultados según la puntuación del text. Si la etapa TextOr supera este límite:
Si
allowDiskUseestrue, la etapa vierte los resultados intermedios en disco.Si
allowDiskUseesfalse, la query falla con un error por superación del límite de memoria.
En versiones anteriores, la etapa TextOr no tenía límite de memoria y consumía RAM sin restricciones, lo que corría el riesgo de errores de falta de memoria (OOM).
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Los ejemplos asumen un índice de 3 texto de la versión en los title fullplot campos y:
db.movies.createIndex( { title: "text", fullplot: "text" } )
Buscar una sola palabra
Este ejemplo especifica baseball en la cadena $search. La consulta devuelve documentos que contienen la versión lematizada de baseball en los campos indexados title o fullplot:
db.movies.find( { $text: { $search: "baseball" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, runtime: 1 } )
[ { title: 'Baseball', year: 1994, runtime: 1140 } ]
Coincidir con cualquier término de búsqueda
Un string $search delimitado por espacios realiza un OR lógico en cada término. MongoDB devuelve documentos que contienen cualquiera de los términos.
Este ejemplo especifica dos términos separados por espacios. La consulta devuelve documentos que contienen las versiones lematizadas de baseball o colorado en los title fullplot campos indexados o:
db.movies.find( { $text: { $search: "baseball colorado" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 } )
[ { runtime: 1140, title: 'Baseball', fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.', year: 1994 }, { runtime: 1256, title: 'Centennial', fullplot: 'This is the story of the evolution of the town Centennial, Colorado. It follows the paths of dozens of people who come to the area for many reasons: money, freedom, or crime. It also shows the bigoted treatment of the Native Indians by the advancing US colonists. It is topped off with a murder mystery that takes 100 years to solve.', year: 1978 } ]
Buscar un String exacto
Escapa las comillas para coincidir con una string exacta de varias palabras.
Este ejemplo coincide exactamente con la frase ken burns:
db.movies.find( { $text: { $search: "\"ken burns\"" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 } )
[ { runtime: 1140, title: 'Baseball', fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.', year: 1994 } ]
Este ejemplo realiza un OR lógico de dos cadenas exactas:
db.movies.find( { $text: { $search: "\'ken burns\' \'centennial\'" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 } )
[ { runtime: 1140, title: 'Baseball', fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.', year: 1994 }, { runtime: 1256, title: 'Centennial', fullplot: 'This is the story of the evolution of the town Centennial, Colorado. It follows the paths of dozens of people who come to the area for many reasons: money, freedom, or crime. It also shows the bigoted treatment of the Native Indians by the advancing US colonists. It is topped off with a murder mystery that takes 100 years to solve.', year: 1978 } ]
Excluir documentos que contengan un término
Anteponer un término con - para excluir los documentos que contienen ese término.
Este ejemplo coincide con documentos que contienen baseball o colorado pero no sport (versiones lematizadas):
db.movies.find( { $text: { $search: "baseball colorado -sport" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, runtime: 1 } )
[ { title: 'Centennial', year: 1978, runtime: 1256 } ]
Ejemplos de puntuación de relevancia
Devuelva la puntuación de relevancia
Este ejemplo consulta baseball y utiliza para agregar la puntuación de relevancia a cada documento coincidente. El documento devuelto incluye $meta un score campo con la puntuación de relevancia:
db.movies.find( { $text: { $search: "baseball" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, score: { $meta: "textScore" } } )
[ { title: 'Baseball', year: 1994, score: ... } ]
Devolver los 2 documentos coincidentes principales
Utiliza limit() con sort() para devolver los documentos coincidentes más relevantes.
Este ejemplo consulta baseball coloradoo, ordena por puntuación descendente y limita los resultados a los dos primeros documentos:
db.movies.find( { $text: { $search: "baseball colorado" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } ).limit(2)
[ { title: 'Baseball', year: 1994, score: ... }, { title: 'Centennial', year: 1978, score: ... } ]
Combina $text con otras operaciones de query y ordenamiento
Este ejemplo coincide con documentos donde runtime es mayor que 1000 y los campos indexados contienen baseball o colorado. Ordena por puntuación de relevancia ascendente year y luego descendente:
db.movies.find( { runtime: { $gt: 1000 }, $text: { $search: "baseball colorado" } }, { _id: 0, title: 1, year: 1, score: { $meta: "textScore" } } ).sort( { year: 1, score: { $meta: "textScore" } } )
[ { title: 'Centennial', year: 1978, score: ... }, { title: 'Baseball', year: 1994, score: ... } ]
Query en otro idioma
El resto de los ejemplos de esta página utilizan una articles colección con un índice de texto de versión 3 subjecten:
db.articles.createIndex( { subject: "text" } )
La colección contiene 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 } ] )
Utiliza $language para especificar el lenguaje que determina las palabras de parada, el stemmer y las reglas de tokenizador para la 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.
Este ejemplo especifica es (Español) como lenguaje:
db.articles.find( { $text: { $search: "leche", $language: "es" } } )
[ { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 }, { _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 } ]
También se pueden especificar lenguajes por nombre, como spanish. Consulta Lenguajes del query de $text en implementaciones autogestionadas para ver los idiomas compatibles.
Ordenar por puntuación de relevancia
Puedes especificar la expresión { $meta: "textScore" } en sort() 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 incluye la expresión { $meta: "textScore" } tanto en la proyección como sort() en, los documentos de proyección y ordenación pueden tener nombres de campo diferentes para la expresión. Por ejemplo, en la siguiente operación, la proyección utiliza un campo llamado score para la expresión y utiliza el sort() campo ignoredName llamado:
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } ).sort( { ignoredName: { $meta: "textScore" } } )
Insensibilidad a mayúsculas y diacríticos
$text establece por defecto la insensibilidad a mayúsculas, minúsculas y signos diacríticos del índice de texto. Los índices de texto de la versión 3 no distinguen entre diacríticos y mayúsculas/minúsculas en caracteres latinos con diacríticos y alfabetos no latinos como el cirílico. Consulte Insensibilidad a mayúsculas y minúsculas del índice de texto y Insensibilidad a diacríticos del índice de texto.
Este ejemplo realiza una consulta que no distingue entre mayúsculas y minúsculas ni entre diacríticos. Utilizando índices de texto de la versión 3, la consulta coincide con documentos que contienen las versiones lematizadas de los términos de búsqueda:
db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )
[ { _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 } ]
Las versiones anteriores de índice de texto no coincidían con ningún documento.
Distinción entre mayúsculas y minúsculas
Habilita la sensibilidad a mayúsculas y minúsculas con $caseSensitive: true. Esto puede reducir el rendimiento.
Búsqueda de términos que distingue mayúsculas y minúsculas
Este ejemplo realiza una query que distingue mayúsculas y minúsculas para Coffee:
db.articles.find( { $text: { $search: "Coffee", $caseSensitive: true } } )
[ { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]
Búsqueda de String exacta respetando mayúsculas y minúsculas.
Este ejemplo realiza una query que distingue entre mayúsculas y minúsculas para una string exacta de varias palabras:
db.articles.find( { $text: { $search: "\"Café Con Leche\"", $caseSensitive: true } } )
[ { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 } ]
Búsqueda de términos negados sensible a mayúsculas y minúsculas
Se puede utilizar la sensibilidad a mayúsculas y minúsculas con términos negados (términos precedidos con -).
Este ejemplo realiza una query que distingue entre mayúsculas y minúsculas para documentos que contienen Coffee pero no shop (versiones con raíz):
db.articles.find( { $text: { $search: "Coffee -shop", $caseSensitive: true } } )
[ { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]
Distinción de diacríticas
Activa la sensibilidad a los diacríticos con la versión 3 text índices usando $diacriticSensitive: true. Esto puede reducir el rendimiento.
Búsqueda de términos sensibles a diacríticos
Este ejemplo realiza una query sensible a diacríticos para CAFÉ (versión reducida):
db.articles.find( { $text: { $search: "CAFÉ", $diacriticSensitive: true } } )
[ { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 } ]
Búsqueda de términos negados sensibles a diacríticos
Puedes utilizar la sensibilidad a los diacríticos con términos negados (términos precedidos por -).
Este ejemplo realiza una query que distingue diacríticos para documentos que contienen leches pero no cafés (versiones con derivación):
db.articles.find( { $text: { $search: "leches -cafés", $diacriticSensitive: true } } )
[ { _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 } ]