В этой главе мы рассмотрим полнотекстовый поиск в 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 не обеспечивает очень хорошую поддержку для китайских фраз.