Overview
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, el cual realiza una operación lógica OR en cada término separado por un espacio en la string del query. También puedes especificar más opciones al operador para gestionar la sensibilidad de mayúsculas y minúsculas, palabras vacías y derivaciones de palabras (como formas en plural u otros tiempos verbales) para un lenguaje compatible. Esto se utiliza a menudo para texto no estructurado como transcripciones, ensayos o páginas web.
El operador del query $text requiere que indiques el campo de query en un índice de texto de tu colección. Consulte los ejemplos a continuación para ver el código de muestra para crear un índice de texto y usar el operador del query $text.
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.
Ejemplos
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" });
Utilizamos un índice de texto de un solo campo para los ejemplos de esta guía, pero puedes crear un índice de texto compuesto que amplíe tus consultas de texto a múltiples 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 pesos de campos al crear un índice de texto, consulte el Sección Índices de texto en la guía Índices.
Solo puedes crear un índice de texto por colección. Cada query de texto busca coincidencias en todos los campos especificados en ese índice.
Para obtener más información sobre los índices de texto, consulta Índices de Texto en el Manual del Servidor.
Consulta de palabras
Este ejemplo consulta películas de Star Trek buscando títulos que contengan la palabra "trek". Si deseas realizar una query utilizando varias palabras, separa las palabras con espacios para buscar documentos que coincidan con alguno de los términos de búsqueda (condición lógica OR).
// 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 query encontró todos los documentos en la colección movies con un título que incluía la palabra "trek". Desafortunadamente, la búsqueda incluyó un elemento no intencionado: "Trek Nation", que es una película sobre Star Trek y no forma parte de la serie de películas de Star Trek. Para resolver esto, podemos hacer una búsqueda con una frase más específica.
Query por frase
Para que tu consulta sea más específica, intenta usar la frase "star trek" en lugar de solo la palabra "trek". Para buscar por frase, encierra tu frase de varias palabras entre comillas escapadas (\"<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 del 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", que en este caso se traduce sólo en películas de Star Trek de ficción. Desafortunadamente, esta consulta devolvió "Star Trek Into
Darkness", una película que no formaba parte de la serie original de películas. Para resolver este problema, podemos omitir ese documento con una negación.
Query con negaciones
Para usar un término negado, coloque un signo negativo, -, delante del término que desea omitir del conjunto de resultados. La operación de query omite cualquier documento que contenga este término de los resultados de búsqueda. Dado que esta query incluye dos términos distintos, sepáralos 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.
Ordenar por relevancia
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, consulta la página del manual.