Используйте функцию текстового поиска в Cloud Firestore для поиска определенных строк в коллекции.
Прежде чем начать
Прежде чем начать использовать текстовые запросы, выполните следующие действия:
Убедитесь, что у вас есть доступ к существующей базе данных операций, совместимой с MongoDB, или создайте базу данных и подключитесь к ней .
Убедитесь, что у вас есть текстовый индекс, или создайте текстовый индекс .
Разрешения 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.