Nota
Esta página describe las funciones de consulta de texto para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB, MongoDB también ofrece una solución mejorada de consulta de texto completo. Búsqueda MongoDB y una solución de búsqueda vectorial, Vector Search.
Esta página describe el $text Operador para implementaciones autogestionadas.
Definición
$text$textrealiza una consulta de texto en 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 estos campos:
Campo | Tipo | Descripción |
|---|---|---|
| string | Una cadena de términos que MongoDB analiza y utiliza para consultar el índice de texto. MongoDB realiza una |
| string | Opcional. El idioma que determina las reglas de palabras vacías, lematizador y tokenizador. El valor predeterminado es el idioma del índice. Para conocer los idiomas compatibles, consulte Idiomas de búsqueda de texto 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 3 índices de texto de la versión. El valor predeterminado |
De forma predeterminada, $text no ordena los resultados por puntuación. Consulta Puntuación de texto para obtener más información sobre la ordenación por puntuación.
Comportamiento
Restricciones
Una consulta solo puede especificar una expresión
$text.$textno puede aparecer en expresiones$nor.$textno puede aparecer en$elemMatchquery o expresiones de proyección.Todas las cláusulas deben estar indexadas
$orpara$textutilizar.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.La API estable 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 $search campo, especifique las palabras que MongoDB utiliza para consultar el índice de texto.
Nota
El $search campo difiere de la etapa de agregación $search de MongoDB Atlas. La $search etapa proporciona búsqueda de texto completo y solo está disponible en MongoDB Atlas.
Cadenas exactas
Para que coincida exactamente con una cadena de varias palabras en lugar de términos individuales, encierre la cadena entre comillas dobles de 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 cadena $search devuelve documentos con la cadena exacta "ssl certificate":
"\"ssl certificate\" authority key"
Negaciones
Anteponga un guión menos (-) a una palabra para negarla:
Las palabras negadas excluyen del conjunto de resultados los documentos que contienen la palabra negada.
Una cadena con solo palabras negadas no coincide con ningún documento.
Las palabras con guion, como
pre-market, no son negaciones. MongoDB trata el guion como delimitador. Para negarmarket, usepre -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 idioma, como the y and en inglés.
Palabras lematizadas
Sin distinción entre$text mayúsculas y minúsculas, coincide con la palabra completa. Si un campo de documento blueberry contiene, un $search término de blue no coincide. Sin embargo, blueberry o blueberries sí coinciden.
Sensibilidad a mayúsculas y minúsculas y palabras lematizadas
Con la distinción entre mayúsculas y minúsculas habilitada ($caseSensitive: true), si la raíz del sufijo contiene letras mayúsculas, $text coincide con la palabra exacta.
Distinción de diacríticas y palabras lematizadas
Con la sensibilidad diacrítica habilitada$diacriticSensitive: true (), si la raíz del sufijo contiene marcas diacríticas, $text coincide con la palabra exacta.
Insensibilidad a las mayúsculas y minúsculas
$text Por defecto, el índice de texto no distingue entre mayúsculas y minúsculas:
El índice de texto de la versión 3 no distingue entre mayúsculas y minúsculas para caracteres latinos con o sin diacríticos y alfabetos no latinos como el cirílico.
Las versiones anteriores no distinguen entre mayúsculas y minúsculas para caracteres latinos sin diacríticos (
[A-z]).
Habilitar la distinción entre 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:
Consulta el índice de texto en busca de coincidencias que no distingan entre mayúsculas y minúsculas y diacríticos.
Filtra los resultados para devolver sólo 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, se establece la insensibilidad diacrítica del índice de texto:
El índice de texto de la versión no distingue entre caracteres con signos diacríticos y sus equivalentes sin ellos 3
éêe(,,).Las versiones anteriores son sensibles a los signos diacríticos.
Habilitación de la sensibilidad diacrítica
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 son sensibles a los signos diacríticos, por lo que $diacriticSensitive no tiene efecto.
Proceso de sensibilidad a los diacríticos
Con í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 devolver sólo los documentos que coincidan con los signos diacríticos en los términos especificados.
Habilitar $diacriticSensitive: true puede disminuir el rendimiento.
Con versiones de índice de texto anteriores, $diacriticSensitive: true consulta el índice de texto que ya es sensible a los 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.
Ejemplos
Los siguientes ejemplos utilizan una articles colección con un índice de texto de versión 3 subjecten:
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 } ] )
Buscar una sola palabra
Este ejemplo especifica coffee en la cadena $search:
db.articles.find( { $text: { $search: "coffee" } } )
Esto devuelve documentos que contienen la versión derivada de coffee en el campo indexado subject:
{ _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 }
Coincidir con cualquier término de búsqueda
Una cadena $search delimitada por espacios ejecuta un OR lógico en cada término. MongoDB devuelve documentos que contienen cualquiera de los términos.
Este ejemplo especifica tres términos delimitados por espacios:
db.articles.find( { $text: { $search: "bake coffee cake" } } )
Esto devuelve documentos que contienen las versiones derivadas bake de, coffee o cake en el subject campo indexado:
{ "_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 }
Buscar una cadena exacta
Escape las comillas para que coincida con una cadena de varias palabras exacta.
Este ejemplo coincide exactamente con la cadena 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 }
Este ejemplo realiza un OR lógico de dos cadenas exactas:
db.articles.find( { $text: { $search: "\'coffee shop\' \'Cafe con Leche\'" } } )
Esto devuelve documentos que contienen cualquiera de las cadenas, incluidos documentos con términos de ambas cadenas:
[ { _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
Anteponga - a un término para excluir documentos que contengan ese término.
Este ejemplo coincide con documentos que contienen coffee pero no shop (versiones derivadas):
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
Utilice $language para especificar el idioma que determina las palabras vacías, el lematizador y las reglas de tokenizador para la cadena $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 idioma:
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 }
También puede especificar idiomas por nombre,spanish como.Consulte "Idiomas de búsqueda de texto en implementaciones autogestionadas" para ver los idiomas compatibles.
Insensibilidad a mayúsculas y diacríticos
$text El índice de texto no distingue entre mayúsculas y minúsculas ni entre diacríticos. Los índices de texto de la versión no distinguen entre mayúsculas y minúsculas para caracteres latinos con diacríticos y alfabetos no latinos como el cirílico. Consulte "Insensibilidad a mayúsculas y minúsculas en el índice de texto"3 e "Insensibilidad a diacríticos en el índice de texto".
Este ejemplo realiza una consulta que no distingue entre mayúsculas y minúsculas ni diacríticos:
db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )
Usando los índices de texto de la versión 3, esto coincide:
{ "_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 del í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 entre mayúsculas y minúsculas
Este ejemplo realiza una consulta que distingue entre mayúsculas y minúsculas para Coffee:
db.articles.find( { $text: { $search: "Coffee", $caseSensitive: true } } )
Esto coincide solo con:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
Búsqueda de cadena exacta que distingue entre mayúsculas y minúsculas
Este ejemplo realiza una consulta que distingue entre mayúsculas y minúsculas para una cadena de varias palabras exacta:
db.articles.find( { $text: { $search: "\"Café Con Leche\"", $caseSensitive: true } } )
Esto coincide solo con:
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }
Búsqueda de términos negados que distingue entre mayúsculas y minúsculas
Puede utilizar la distinción entre mayúsculas y minúsculas con términos negados (términos con el prefijo -).
Este ejemplo realiza una consulta que distingue entre mayúsculas y minúsculas para documentos que contienen Coffee pero no shop (versiones derivadas):
db.articles.find( { $text: { $search: "Coffee -shop", $caseSensitive: true } } )
Esto coincide:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg" }
Distinción de diacríticas
Habilite la sensibilidad diacrítica con los 3 índices de texto de la versión $diacriticSensitive: true usando. Esto puede reducir el rendimiento.
Búsqueda de términos sensibles a diacríticos
Este ejemplo realiza una consulta sensible a los diacríticos para CAFÉ (versión derivada):
db.articles.find( { $text: { $search: "CAFÉ", $diacriticSensitive: true } } )
Esto coincide solo con:
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc" }
Búsqueda de términos negados sensibles a diacríticos
Puede utilizar la sensibilidad diacrítica con términos negados (términos con el prefijo -).
Este ejemplo realiza una consulta que distingue entre diacríticos para documentos que contienen leches pero no cafés (versiones derivadas):
db.articles.find( { $text: { $search: "leches -cafés", $diacriticSensitive: true } } )
Esto coincide:
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }
Ejemplos de puntuación de relevancia
Devuelva la puntuación de relevancia
Este ejemplo query por cake y utiliza $meta 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 score con la puntuación de relevancia:
{ "_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 limit() con para devolver los principales documentos sort() coincidentes.
Este ejemplo consulta coffee, ordena por puntuación descendente y limita los resultados a los dos documentos superiores:
db.articles.find( { $text: { $search: "coffee" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } ).limit(2)
Tip
Combine $text con otras operaciones de consulta y ordenación
Este ejemplo busca documentos donde author es "xyz" y subject contiene coffee o bake. Se ordena por puntuación de relevancia ascendente date y descendente:
db.articles.find( { author: "xyz", $text: { $search: "coffee bake" } }, { score: { $meta: "textScore" } } ).sort( { date: 1, score: { $meta: "textScore" } } )