Cómo usar la búsqueda por texto

Usa las funciones de búsqueda de texto en Cloud Firestore para buscar cadenas específicas dentro de una colección.

Antes de comenzar

Antes de comenzar a usar las búsquedas de texto, haz lo siguiente:

  1. Asegúrate de tener acceso a una base de datos de operaciones compatible con MongoDB existente o crea una base de datos y conéctate a ella.

  2. Asegúrate de tener un índice de texto o crea uno.

Las búsquedas de texto usan el operador $text dentro de un filtro. Especifica la cadena de consulta en el argumento $search.

Ejecuta el siguiente comando para realizar una búsqueda de texto general:

  # Find search
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "french bread" } } }
  ]);

Si tu índice está particionado, puedes filtrar según la partición incluyendo la partición en un filtro de igualdad "and" dentro de tu búsqueda. Por ejemplo, si tuvieras una partición city, podrías filtrar una búsqueda de texto de la siguiente manera:

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

También puedes filtrar una agregación según una partición. Por ejemplo:

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

El valor de tu partición debe ser una cadena. El filtro de partición debe unirse a la Text Search con un "and".

Establece el idioma de la búsqueda de texto

Puedes establecer el idioma de la búsqueda de texto con el argumento $language. Por ejemplo:

  db.cities.find({ $text: { $search: "french bread", $language: "en"} })

Si no estableces un idioma, la búsqueda usará el idioma del índice de texto.

Cómo buscar un término exacto

Para buscar un término exacto, configúralo como una secuencia de palabras encerradas entre comillas dobles. Por ejemplo:

  # Find search
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

Busca una combinación de términos

Para que tu búsqueda de texto sea más precisa, especifica una cadena de términos. Por ejemplo, la siguiente búsqueda devuelve documentos que coinciden con la combinación best AND french AND ("bread" OR "is"):

  # Find search
  db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
  ]);

Cómo excluir un término

Para excluir un término de una búsqueda de texto, coloca un guion (-) antes del término:

  # Find search
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

Calcula la puntuación de relevancia

Usa la expresión {$meta: "textScore"} para calcular la puntuación de relevancia de los documentos que coinciden con la búsqueda de texto. Para ordenar los resultados en orden descendente por puntuación, usa $meta en una expresión de orden. Considera los siguientes ejemplos, en los que SCORE_FIELD es el nombre del campo que se usa para almacenar el valor de la puntuación:

  # Find search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
  ]);

También puedes usar la puntuación de texto en expresiones de proyección. Por ejemplo:

  # Find search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $project: { "scoreField": { $meta: "textScore"} } },
  ]);

Para mejorar la relevancia de los resultados de la Text Search, el operador $text aumenta la cadena de búsqueda según el idioma especificado para incluir coincidencias de sinónimos que tienen en cuenta el contexto, formas derivadas, términos con corrección ortográfica, variaciones diacríticas y mucho más.

Limitaciones

  • Los operadores $near y $text no se pueden usar en la misma búsqueda de texto.
  • Se permite un solo operador $text por búsqueda de find o aggregation.
  • En las agregaciones, la etapa $match con $text debe ser la primera etapa de la canalización.
  • $text solo se puede anidar dentro de $and y $or.
  • Si $text está dentro de $or, las disyunciones que no son de búsqueda pueden usar índices ordenados existentes para optimizar la búsqueda. Si las otras disyunciones no están indexadas, la búsqueda se basa en un análisis de la colección.
  • $text no se puede usar con sugerencias.
  • Las consultas con Text Search no se pueden ordenar por $natural.