Поиск текста в MongoDB

Опубликовано: 5 Октября, 2022

MongoDB предоставляет хороший метод текстового поиска. Используя эту технику, мы можем найти фрагмент текста или заданное слово из строковых полей. Или, другими словами, MongoDB позволяет вам выполнить операцию запроса, чтобы найти указанный текст из строки. В MongoDB мы можем выполнять текстовый поиск, используя текстовый индекс и оператор $text.

Текстовый указатель: Проверенные текстовые индексы MongoDB, которые используются для поиска указанного текста из содержимого строки. Текстовые индексы должны быть либо строкой, либо массивом строковых элементов. Когда вы выполняете текстовый поисковый запрос, всегда помните, что ваша коллекция должна содержать текстовый индекс, а коллекция может содержать только один текстовый индекс, но этот единственный текстовый индекс охватывает несколько полей. Мы можем создать текстовый индекс, используя метод createIndex().

Синтаксис:

db.collectionName.createIndex( { field: “text” } )

Оператор $text: Вы также можете искать текстовый индекс, используя оператор $text. Этот оператор используется для выполнения операций текстового поиска в коллекции с текстовым индексом. Этот оператор размечает каждую строку поиска пробелом и обрабатывает большинство знаков препинания как разделители, кроме - и ". После токенизации строки поиска он выполняет логическую операцию ИЛИ над токенами. Если вы хотите отсортировать результирующие документы, используйте оператор запроса $meta.

Синтаксис:

$text:

{

     $search: <string>,

     $language: <string>,

     $caseSensitive: <boolean>,

     $diacriticSensitive: <boolean>

}

Как искать текст?

Используя следующие шаги, мы можем искать текст в MongoDB:

Шаг 1: Сначала мы создаем коллекцию и добавляем в нее несколько документов:

В следующем примере мы работаем с:

Database: gfg

Collection: content

Document: The content collection contains the three documents.

Шаг 2: Создайте индекс:

Теперь мы создаем строковый индекс для полей имени и питомца с помощью функции createIndex(). метод. Таким образом, мы можем искать текст по полям имени и строки:

db.content.createIndex({name:"text",line:"text"})

Шаг 3: Найдите текст:

Теперь мы готовы к поиску текста. Например, мы собираемся искать все документы, содержащие текст любви.

db.content.find({$text:{$search:"love"}})  

Примечание. $text — это оператор запроса, который выполняет текстовый поиск в коллекции с текстовым индексом.

Еще один пример, в котором мы собираемся искать все документы, содержащие текст собаки:

db.content.find({$text:{$search:"dog"}})

Как искать фразы?

Вместо поиска по одному слову вы также можете искать фразу, заключая фразу в двойные кавычки (""). Как правило, поиск по фразе выполняет операцию ИЛИ между указанными ключевыми словами. Например, фраза «Мне нравится Mango», затем поэтапный поиск ищет все документы, содержащие ключевые слова I, Like или Mango. И если вы хотите выполнить точный поиск по фразе, заключите фазу между экранированными двойными кавычками (”).

Синтаксис:

Для поиска по фразе:

db.collectionName.find({$text:{$search:”Phrase”}})

Для точного поиска по фразе:

db.collectionName.find({$text:{$search:””Phrase””}})

Примеры:

В следующих примерах мы работаем с:

Database: gfg

Collection: content

Document: The content collection contains the three documents.

  • Найдите фразу:
db.content.find({$text:{$search:"I love dogs"}})

Здесь мы ищем фразу «Я люблю собак». Итак, в результате мы получаем все документы, содержащие ключевые слова я, люблю или собаки.

  • Найдите точную фразу:
db.content.find({$text:{$search:""I love dogs""}})

Здесь мы ищем точную фразу, заключая фазу между экранированными двойными кавычками ("). Например, «"Я люблю собак"». Итак, в результате мы получаем только те документы, которые содержат указанную точную фразу.

Как исключить термин из поиска?

Исключение термина означает, что вы выполняете операцию поиска и не хотите отображать документ, содержащий указанный термин, поэтому вы можете исключить термин, поставив перед ключевым словом поиска знак минус (-). Используя знак минус (-), вы можете исключить все документы, содержащие термин исключения. Например, вы хотите отобразить все документы, которые содержат ключевое слово «автомобиль», но не содержат ключевое слово «велосипед», поэтому вы можете использовать следующий запрос:

dn.collectionName.find({$text:{$search:"Car -Cycle"}})

Например:

В следующем примере мы работаем с:

Database: gfg

Collection: content

Document: The content collection contains the three documents.

db.content.find({$text:{$search:"dog -cow"}})

Здесь мы отображаем только те документы, которые содержат собаку, а не корову.

Поиск текста с использованием конвейера агрегации

Мы можем искать текст, используя конвейер агрегации с помощью оператора запроса $text на этапе $match . Но есть некоторые ограничения на использование оператора $text :

  • Первым этапом конвейера должен быть этап $match , содержащий оператор $text .
  • Только один раз на этапе появится текстовый оператор.
  • Выражение текстового оператора не может появляться в выражениях $or или $not .
  • По умолчанию текстовый поиск не возвращает совпадающие документы в порядке совпадающих оценок. Если вы хотите выполнить сортировку по убыванию, используйте выражение агрегации $meta на этапе $sort.

Примечание. Текстовая оценка — это оценка, которая назначается каждому документу, содержащему условие поиска в поле индекса, с помощью оператора $text. Оценка отражает важность документа для заданного запроса текстового поиска.

Пример:

В следующем примере мы работаем с:

Database: gfg

Collection: people

Document: The people collection contains the five documents.

  • Подсчитайте номер документа, в котором питомцем является кошка:
db.people.aggregate([{$match:{$text:{$search:"Cat"}}},
             {$group:{_id:null,total:{$sum:1}}}])

  • Подсчитайте номер документа, в котором питомцем является собака:
db.people.aggregate([{$match:{$text:{$search:"Dog"}}},
             {$group:{_id:null,total:{$sum:1}}}])

  • Верните результат Sorted, используя текстовую оценку:
db.people.aggregate([{$match:{$text:{$search:"Dog"}}},
                     {$sort:{score:{$meta:"textScore"}}},
                     {$project:{_id:0,name:1}}])

Здесь мы возвращаем результат (все документы, содержащие указанный текст, например, «Собака») в отсортированном виде с использованием textScore.