В этой главе мы рассмотрим полнотекстовый поиск в MongoDB, который отличается от оператора "like" в SQL. Полнотекстовый поиск в MongoDB более эффективен для поиска текста по сравнению с реализацией "like" в SQL.

Подготовка тестовых данных

Вставьте несколько записей в коллекцию stores

db.stores.insert(
   [
     { _id: 1, name: "Java Hut", description: "Кофе и торты" },
     { _id: 2, name: "Burger Buns", description: "Гурманские гамбургеры" },
     { _id: 3, name: "Coffee Shop", description: "Просто кофе" },
     { _id: 4, name: "Clothes Clothes Clothes", description: "Скидочная одежда" },
     { _id: 5, name: "Java Shopping", description: "Индонезийские товары" }
   ]
)

Создание текстового индекса

Для использования возможности полнотекстового поиска необходимо создать текстовый индекс. Пример:

db.stores.createIndex( { name: "text", description: "text" } )

Пояснение:

  • Создание индекса типа text для полей name и description.

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

Оператор $text

Используйте оператор $text для текстового поиска.

Синтаксис:

{ $text: { $search: "ключевое слово для поиска" } }

Пример:

db.stores.find( { $text: { $search: "java coffee shop" } } )

Пояснение:

  • Поиск документов, содержащих ключевые слова "кофе", "магазин" и "джава" в полях name и description.

Вывод:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Просто кофе" }
{ "_id" : 1, "name" : "Java Hut", "description" : "Кофе и торты" }
{ "_id" : 5, "name" : "Java Shopping", "description" : "Индонезийские товары" }

Поиск фраз

db.stores.find( { $text: { $search: "\"кофейный магазин\"" } } )

Вывод

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Просто кофе" }

Сортировка по релевантности

По умолчанию результаты запроса $text не отсортированы. Запрос $text вычисляет оценку (textScore) для релевантности каждого документа. Мы можем использовать эту оценку для сортировки и отображения документов с более высокой релевантностью вверху.

db.stores.find(
   { $text: { $search: "java coffee shop" } },
   { score: { $meta: "textScore" } }  // Указываем вернуть оценку релевантности textScore
).sort( { score: { $meta: "textScore" } } ) // Указываем сортировку с использованием textScore

Примечание: Полнотекстовый поиск MongoDB не обеспечивает очень хорошую поддержку для китайских фраз.