En este capítulo, presentaremos la búsqueda de texto completo de MongoDB, la cual es diferente al operador "like" de SQL. La búsqueda de texto completo de MongoDB es más eficiente para buscar texto en comparación con la implementación de "like" en SQL.

Preparar datos de prueba

Inserta algunos registros en la colección de tiendas

db.stores.insert(
   [
     { _id: 1, name: "Java Hut", description: "Café y pasteles" },
     { _id: 2, name: "Burger Buns", description: "Hamburguesas gourmet" },
     { _id: 3, name: "Coffee Shop", description: "Solo café" },
     { _id: 4, name: "Ropa Ropa Ropa", description: "Ropa de descuento" },
     { _id: 5, name: "Java Shopping", description: "Productos indonesios" }
   ]
)

Crear índice de texto

Para utilizar la capacidad de búsqueda de texto completo, debes crear un índice de texto. Ejemplo:

db.stores.createIndex( { name: "text", description: "text" } )

Explicación:

  • Crear un índice de tipo texto para los campos de nombre y descripción.

Nota: Una colección solo permite un índice de texto, pero un índice de texto puede incluir varios campos.

Operador $text

Utiliza el operador $text para la búsqueda de texto.

Sintaxis:

{ $text: { $search: "palabra clave de búsqueda" } }

Ejemplo:

db.stores.find( { $text: { $search: "java café tienda" } } )

Explicación:

  • Buscar documentos que contengan las palabras clave "café", "tienda" y "java" en los campos de nombre y descripción.

Resultado:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Solo café" }
{ "_id" : 1, "name" : "Java Hut", "description" : "Café y pasteles" }
{ "_id" : 5, "name" : "Java Shopping", "description" : "Productos indonesios" }

Búsqueda de frase

db.stores.find( { $text: { $search: "\"café tienda\"" } } )

Resultado

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Solo café" }

Orden de relevancia

Por defecto, los resultados de una consulta $text no están ordenados. La consulta $text calcula una puntuación (textScore) para la relevancia de cada documento. Podemos usar esta puntuación para ordenar y mostrar documentos con mayor relevancia en la parte superior.

db.stores.find(
   { $text: { $search: "java café tienda" } },
   { score: { $meta: "textScore" } }  // Declarar para devolver la puntuación de relevancia textScore
).sort( { score: { $meta: "textScore" } } ) // Especificar la clasificación usando textScore

Nota: La búsqueda de texto completo de MongoDB no proporciona un buen soporte para frases en chino.