Воспользуйтесь текстовым поиском

Используйте функцию текстового поиска в Cloud Firestore для поиска определенных строк в коллекции.

Прежде чем начать

Прежде чем начать использовать текстовый поиск, выполните следующие действия:

  1. Убедитесь, что у вас есть доступ к существующей базе данных операций, совместимой с MongoDB, или создайте базу данных и подключитесь к ней .

  2. Убедитесь, что у вас есть текстовый индекс, или создайте текстовый индекс .

Для текстового поиска используется оператор $text внутри фильтра. Укажите искомую строку в аргументе $search .

Для выполнения общего текстового поиска выполните следующую команду:

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

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

Если ваш индекс разбит на разделы, вы можете фильтровать результаты по разделу, включив раздел в фильтр равенства "И" в вашем поисковом запросе. Например, если у вас есть раздел city , вы можете отфильтровать текстовый поиск следующим образом:

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

Также можно фильтровать агрегированные данные по разделу. Например:

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

Значение вашего раздела должно быть строкой. Ваш фильтр разделов должен быть объединен с текстовым поиском с помощью оператора «и».

Установите язык поиска текста

Язык текстового поиска можно задать с помощью аргумента $language . Например:

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

Если язык не указан, поиск будет использовать язык текстового индекса.

Поиск точного термина

Для поиска точного термина укажите его в виде последовательности слов, заключенных в двойные кавычки. Например:

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

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

Поиск комбинации терминов

Для повышения точности текстового поиска укажите цепочку терминов. Например, следующий поиск вернет документы, которые лучше всего соответствуют комбинации слов "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" } } },
  ]);

Исключить термин

Чтобы исключить термин из текстового поиска, поставьте перед ним дефис (-):

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

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

Рассчитайте показатель релевантности

Используйте выражение {$meta: "textScore"} для вычисления показателя релевантности документов, найденных с помощью текстового поиска. Для сортировки результатов в порядке убывания используйте $meta в выражении сортировки. Рассмотрим следующие примеры, где SCORE_FIELD — это имя поля, используемого для хранения значения показателя:

  # 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"} } },
  ]);

В выражениях проекции также можно использовать текстовую оценку. Например:

  # 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"} } },
  ]);

Для повышения релевантности результатов текстового поиска оператор $text дополняет поисковую строку в соответствии с указанным языком, включая совпадения с контекстно-зависимыми синонимами, стеммированными формами, орфографически исправленными терминами, вариантами диакритических знаков и многим другим.

Ограничения

  • Операторы $near и операторы $text нельзя использовать в одном и том же текстовом поиске.
  • Для каждого find или aggregation допускается использование одного оператора $text .
  • В агрегациях этап $match с $text должен быть первым этапом конвейера.
  • $text может быть вложен только в $and и $or .
  • Если $text находится внутри переменной $or , то неиндексируемые дизъюнкты могут использовать существующие упорядоченные индексы для оптимизации поиска. Если другие дизъюнкты не проиндексированы, то поиск осуществляется путем сканирования коллекции.
  • $text нельзя использовать с подсказками.
  • Запросы с текстовым поиском не могут сортироваться по переменной $natural .