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