Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$text (implementaciones autogestionadas)

Nota

Esta página describe las capacidades de query de texto para implementaciones autogestionadas (no-Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de query de texto completo. Búsqueda Atlas y una solución de búsqueda vectorial, Búsqueda vectorial Atlas.

Esta página describe el $text operador para implementaciones autogestionadas.

$text

$text realiza una query de texto en campos indexados con un text index.

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.

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

$search

string

Una string de términos que MongoDB analiza y usa para consultar el índice de texto. MongoDB realiza una logical OR query sobre los terms a menos que se especifique una exact string. Consulta Comportamiento para más detalles.

$language

string

Opcional. El lenguaje que determina las palabras de parada, el stemmer y las reglas del tokenizador. Por defecto, se utiliza el lenguaje del índice. Para conocer los idiomas admitidos, consulta Idiomas de búsqueda de texto en implementaciones autogestionadas.

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.

$caseSensitive

booleano

Opcional. Activa la sensibilidad a mayúsculas y minúsculas. Los valores por defecto son false. Consulta Insensibilidad a mayúsculas y minúsculas.

$diacriticSensitive

booleano

Opcional. Habilita la sensibilidad diacrítica para los índices de texto de la versión 3. Se establece en false por defecto. Las versiones anteriores del índice de texto siempre distinguen diacríticas. Consulta Insensibilidad al diacrítico.

Por defecto, $text no ordena los resultados por puntuación. Consulta Calificación del texto para obtener detalles sobre la ordenación de puntuaciones.

  • Una query puede especificar solo una expresión $text.

  • $text no puede aparecer en expresiones $nor.

  • $text no puede aparecer en $elemMatch query o expresiones de proyección.

  • Todas las cláusulas $or deben indexarse para utilizar $text.

  • Si un query incluye una expresión $text, no se puede usar hint() para especificar qué índice usar para el query.

  • Las consultas con $text no pueden usar $natural orden.

  • 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 $text con el operador $near.

  • Las vistas no son compatibles con $text.

  • Stable API V1 no admite $text para la creación de índices.

Si se utiliza el operador $text en la agregación, también se aplican las siguientes restricciones.

  • La etapa $match que incluye un $text debe ser la primera etapa en el pipeline.

  • Un operador $text solo puede ocurrir una vez en la etapa.

  • La expresión del Operador $text no puede aparecer en $or ni 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 $meta en la etapa $sort.

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.

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"

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-market no son negaciones. MongoDB trata el guion como un delimitador. Para negar market, utiliza pre -market.

MongoDB aplica todas las negaciones a la operación con AND lógico.

MongoDB ignora las palabras vacías específicas del lenguaje, como the y and en inglés.

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.

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.

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.

$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]).

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.

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.

$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.

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.

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.

Tip

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.

Los siguientes ejemplos utilizan una colección articles con un índice texto versión 3 en subject:

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 }
] )

Este ejemplo especifica coffee en la string $search:

db.articles.find( { $text: { $search: "coffee" } } )

Esto devuelve documentos que contienen la versión lematizada de coffee en el campo de índice 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 }

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.

En este ejemplo se especifican tres términos delimitados por espacios:

db.articles.find( { $text: { $search: "bake coffee cake" } } )

Esto devuelve documentos que contienen las versiones con palabras base de bake o coffee o cake en el campo indexado subject:

{ "_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 }

Escapa las comillas para coincidir con una string exacta de varias palabras.

Este 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 }

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 contengan cualquiera de las cadenas, incluidos los 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 }
]

Anteponer un término con - para excluir los documentos que contienen ese término.

Este ejemplo coincide con documentos que contienen coffee, pero no shop (versiones con desinencias):

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 }

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" } }
)

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 puedes especificar lenguajes por nombre, como spanish. Consulta Lenguajes de búsqueda de texto en implementaciones autogestionadas para obtener información sobre los lenguajes compatibles.

$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 query que no distingue entre mayúsculas y minúsculas ni diacríticas:

db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )

Usando í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 de índice de texto no coincidían con ningún documento.

Habilita la sensibilidad a mayúsculas y minúsculas con $caseSensitive: true. Esto puede reducir el rendimiento.

Este ejemplo realiza una query que distingue 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 }

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 }
} )

Esto coincide solo con:

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc", "views" : 200 }

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 } } )

Esto coincide con:

{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg" }

Activa la sensibilidad a los diacríticos con la versión 3 text índices usando $diacriticSensitive: true. Esto puede reducir el rendimiento.

Este ejemplo realiza una query sensible a diacríticos para CAFÉ (versión reducida):

db.articles.find( { $text: { $search: "CAFÉ", $diacriticSensitive: true } } )

Esto coincide solo con:

{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc" }

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 } }
)

Esto coincide con:

{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }

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 }
  • 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 incluyes la expresión { $meta: "textScore" } tanto en la proyección como en el sort(), 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 named score for the expression and the sort() uses the field named ignoredName.
    db.articles.find(
    { $text: { $search: "cake" } } ,
    { score: { $meta: "textScore" } }
    ).sort( { ignoredName: { $meta: "textScore" } } )

Utiliza limit() con sort() para devolver los documentos coincidentes más relevantes.

Este ejemplo query para coffee, ordena por puntuación descendente y limita los resultados a los dos documentos principales:

db.articles.find(
{ $text: { $search: "coffee" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ).limit(2)

Este ejemplo coincide con los documentos donde author es "xyz" y subject contiene coffee o bake. Ordena por date ascendente, luego por puntuación de relevancia descendente:

db.articles.find(
{ author: "xyz", $text: { $search: "coffee bake" } },
{ score: { $meta: "textScore" } }
).sort( { date: 1, score: { $meta: "textScore" } } )

Volver

$text operador del query

En esta página