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

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

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

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

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

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

Разрешения IAM

Для создания индекса в Cloud Firestore убедитесь, что вам назначена одна из следующих ролей:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Чтобы назначить роль, см. раздел «Назначение одной роли» . Дополнительную информацию о ролях Cloud Firestore и связанных с ними разрешениях см. в разделе «Предопределенные роли» .

Если вы определили пользовательские роли, назначьте все следующие разрешения для создания индексов:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Выполните текстовый запрос

В текстовых запросах оператор $text используется внутри фильтра. Строку запроса следует указать в аргументе $search .

Выполните общий текстовый запрос

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

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

  # Aggregation query
  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 query
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

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

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

Чтобы сделать запрос более точным, укажите цепочку терминов. Например, следующий запрос возвращает документы, которые наилучшим образом соответствуют комбинации AND french AND ("bread" OR "is") :

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

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

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

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

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

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

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

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

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

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

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

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

  # Aggregation query
  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 .