Docs Menu
Docs Home
/ /
Operadores de búsqueda de texto
/ / / /

$text (implementaciones autogestionadas)

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.

$text

$text realiza una consulta de texto sobre el contenido de los campos indexados con un índice de texto.

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 un documento de query de texto con los siguientes campos:

Campo
Tipo
Descripción

$search

string

Una string de términos que MongoDB analiza y utiliza para hacer una query al índice de texto. MongoDB realiza una query OR lógica sobre los términos, a menos que especifiques los términos como una string exacta. Para obtener más información sobre el campo, consulta Comportamiento.

$language

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 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. Un indicador booleano para activar o desactivar la distinción entre mayúsculas y minúsculas. Se establece en false por defecto. Si no se especifica, MongoDB no distingue entre mayúsculas y minúsculas en el índice de texto.

Para obtener más información, consulta Sin distinción entre mayúsculas y minúsculas.

$diacriticSensitive

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 false por defecto. Si no se especifica, MongoDB no distingue diacríticas del índice de texto.

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 $diacriticSensitive no tiene efecto en las versiones anteriores del índice text.

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.

  • Un query puede especificar, como máximo, una expresión $text.

  • $text no puede aparecer en expresiones $nor.

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

  • Para usar $text en una expresión $or, todas las cláusulas del arreglo $or deben estar indexadas.

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

  • No puedes especificar el orden de clasificación $natural si 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 $text con el operador $near.

  • Las vistas no son compatibles con $text.

  • $text no 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 $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 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.

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"

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, $text no 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 $text considera el guion-menos (-) como un delimitador. Para negar la palabra market en esta instancia, incluye un espacio entre pre y -market, es decir, pre -market.

El operador $text agrega todas las negaciones a la operación con el operador lógico AND.

El operador $text ignora las palabras de parada específicas del idioma, como the y and en inglés.

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.

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.

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.

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 text son insensibles a mayúsculas y minúsculas para los caracteres latinos sin marcas diacríticas; es decir, para [A-z].

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.

Si $caseSensitive: true y el índice text no distingue entre mayúsculas y minúsculas, el operador $text:

  • Primero realiza queries del índice text para 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 $text incluye 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.

Tip

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 é, ê y e.

  • Las versiones anteriores del índice text distinguen diacríticas.

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.

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

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

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 }

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 }

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

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 }

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.

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.

Para activar la sensibilidad a mayúsculas y mayúsculas, especifica $caseSensitive: true. Al especificar $caseSensitive: true, el rendimiento podría verse afectado

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 }

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 }

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

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.

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

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

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

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)

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

Volver

Operadores de búsqueda de texto

En esta página