Docs Menu
Docs Home
/ /

Texto de query

Las consultas de texto permiten consultar campos de tipo cadena en la colección para palabras o frases específicas. Se puede realizar una consulta de texto mediante $text Operador, que ejecuta un OR lógico en cada término separado por un espacio en la cadena de consulta. También puede especificar más opciones para el operador para gestionar la distinción entre mayúsculas y minúsculas, las palabras vacías y la lematización de palabras (como plurales u otros tiempos verbales) en un idioma compatible. Esto se suele usar para textos no estructurados, como transcripciones, ensayos o páginas web.

El $text operador de consulta requiere que especifique el campo de consulta en un índice de texto de su colección. Consulte los ejemplos a continuación para ver un código de ejemplo para crear un índice de texto y usar el $text operador de consulta.

Nota

MongoDB Search te ayuda a crear funciones de búsqueda rápidas y relevantes basadas en tus datos de MongoDB. Pruébalo hoy mismo en MongoDB Atlas, nuestra base de datos como servicio totalmente gestionada.

Los siguientes ejemplos utilizan datos de muestra de la movies colección en la sample_mflix base de datos. Para habilitar consultas de texto en el title campo, cree un índice de texto con el siguiente comando:

await db.movies.createIndex({ title: "text" });

En los ejemplos de esta guía, utilizamos un índice de texto de un solo campo, pero puede crear un índice de texto compuesto que amplíe sus consultas de texto a varios campos. El siguiente comando crea un índice de texto en dos campos de la colección movies:

await db.movies.createIndex({ title: "text", plot: "text" });

Tip

Especificar pesos de campos en un índice de texto

Al crear un índice de texto compuesto, puedes especificar una opción de peso para priorizar ciertos campos de texto en tu índice. Cuando ejecutes una query de texto, los pesos de los campos influyen en cómo MongoDB calcula la puntuación de query de texto para cada documento coincidente.

Para obtener más información sobre cómo especificar los pesos de los campos al crear un índice de texto, consulte la Sección Índices de texto en la guía Índices.

Solo se puede crear un índice de texto por colección. Cada consulta de texto busca coincidencias en todos los campos especificados en ese índice.

Para obtener más información sobre los índices de texto, consulte Índices de texto en el manual del servidor.

Este ejemplo busca películas de Star Trek buscando títulos que contengan la palabra "trek". Si desea usar varias palabras, sepárelas con espacios para buscar documentos que coincidan con cualquiera de los términos de búsqueda (OR lógico).

// Create a query that searches for the string "trek"
const query = { $text: { $search: "trek" } };
// Return only the `title` of each matched document
const projection = {
_id: 0,
title: 1,
};
// Find documents based on our query and projection
const cursor = movies.find(query).project(projection);

Esta operación devuelve los siguientes documentos:

{ title: 'Trek Nation' }
{ title: 'Star Trek' }
{ title: 'Star Trek Into Darkness' }
{ title: 'Star Trek: Nemesis' }
{ title: 'Star Trek: Insurrection' }
{ title: 'Star Trek: Generations' }
{ title: 'Star Trek: First Contact' }
{ title: 'Star Trek: The Motion Picture' }
{ title: 'Star Trek VI: The Undiscovered Country' }
{ title: 'Star Trek V: The Final Frontier' }
{ title: 'Star Trek IV: The Voyage Home' }
{ title: 'Star Trek III: The Search for Spock' }
{ title: 'Star Trek II: The Wrath of Khan' }

¡Éxito! La consulta encontró todos los documentos de la movies colección cuyo título incluye la palabra "trek". Desafortunadamente, la búsqueda incluyó un elemento no deseado: "Trek Nation", que es una película sobre Star Trek y no forma parte de la saga. Para solucionarlo, podemos usar una frase más específica en la consulta.

Para que tu consulta sea más específica, prueba a usar la frase "Star Trek" en lugar de solo la palabra "Trek". Para buscar por frase, encierra la frase de varias palabras entre comillas (\"<term>\"):

// Create a query that searches for the phrase "star trek"
const query = { $text: { $search: "\"star trek\"" } };
// Return only the `title` of each matched document
const projection = {
_id: 0,
title: 1,
};
// Find documents based on the query and projection
const cursor = movies.find(query).project(projection);

La consulta por la frase "star trek" en lugar de solo el término "trek" coincide con los siguientes documentos:

{ title: 'Star Trek' }
{ title: 'Star Trek Into Darkness' }
{ title: 'Star Trek: Nemesis' }
{ title: 'Star Trek: Insurrection' }
{ title: 'Star Trek: Generations' }
{ title: 'Star Trek: First Contact' }
{ title: 'Star Trek: The Motion Picture' }
{ title: 'Star Trek VI: The Undiscovered Country' }
{ title: 'Star Trek V: The Final Frontier' }
{ title: 'Star Trek IV: The Voyage Home' }
{ title: 'Star Trek III: The Search for Spock' }
{ title: 'Star Trek II: The Wrath of Khan' }

Estos resultados incluyen todas las películas de la base de datos que contienen la frase,"star trek" lo que en este caso solo da como resultado películas ficticias de Star Trek. Lamentablemente, esta consulta "Star Trek Into Darkness" devolvió, una película que no formaba parte de la saga original. Para solucionar este problema, podemos omitir ese documento con una negación.

Para usar un término negado, coloque un signo negativo, -, delante del término que desea omitir del conjunto de resultados. La consulta omite cualquier documento que contenga este término. Dado que esta consulta incluye dos términos distintos, sepárelos con un espacio.

// Create a query that searches for the phrase "star trek" while omitting "into darkness"
const query = { $text: { $search: "\"star trek\" -\"into darkness\"" } };
// Include only the `title` field of each matched document
const projection = {
_id: 0,
title: 1,
};
// Find documents based on the query and projection
const cursor = movies.find(query).project(projection);

La consulta con el término negado produce los siguientes documentos:

{ title: 'Star Trek' }
{ title: 'Star Trek: Nemesis' }
{ title: 'Star Trek: Insurrection' }
{ title: 'Star Trek: Generations' }
{ title: 'Star Trek: First Contact' }
{ title: 'Star Trek: The Motion Picture' }
{ title: 'Star Trek VI: The Undiscovered Country' }
{ title: 'Star Trek V: The Final Frontier' }
{ title: 'Star Trek IV: The Voyage Home' }
{ title: 'Star Trek III: The Search for Spock' }
{ title: 'Star Trek II: The Wrath of Khan' }

Nota

La operación de la query puede devolver una referencia a un cursor que contiene documentos coincidentes. Para aprender cómo examinar los datos almacenados en el cursor, consulta la página Acceso a los datos desde un cursor.

Ahora que el conjunto de resultados refleja los resultados deseados, puede utilizar la consulta de textScore texto, a la que se accede mediante el operador $meta en la proyección de la consulta, para ordenar los resultados por relevancia:

// Create a query that searches for the phrase "star trek" while omitting "into darkness"r
const query = { $text: { $search: "\"star trek\" -\"into darkness\"" } };
// Sort returned documents by descending text relevance score
const sort = { score: { $meta: "textScore" } };
// Include only the `title` and `score` fields in each returned document
const projection = {
_id: 0,
title: 1,
score: { $meta: "textScore" },
};
// Find documents based on the query, sort, and projection
const cursor = movies
.find(query)
.sort(sort)
.project(projection);

Al consultar de esta manera, se devuelven los siguientes documentos en el orden indicado. En general, la relevancia del texto aumenta a medida que una cadena coincide con más términos y disminuye a medida que aumenta la parte no coincidente de la cadena.

{ title: 'Star Trek', score: 1.5 }
{ title: 'Star Trek: Generations', score: 1.3333333333333333 }
{ title: 'Star Trek: Insurrection', score: 1.3333333333333333 }
{ title: 'Star Trek: Nemesis', score: 1.3333333333333333 }
{ title: 'Star Trek: The Motion Picture', score: 1.25 }
{ title: 'Star Trek: First Contact', score: 1.25 }
{ title: 'Star Trek II: The Wrath of Khan', score: 1.2 }
{ title: 'Star Trek III: The Search for Spock', score: 1.2 }
{ title: 'Star Trek IV: The Voyage Home', score: 1.2 }
{ title: 'Star Trek V: The Final Frontier', score: 1.2 }
{ title: 'Star Trek VI: The Undiscovered Country', score: 1.2 }

Para obtener más información sobre el operador $text y sus opciones, consulte la entrada del manual.

Volver

Valores únicos de campo

En esta página