Поиск уже понимает формы слов, ранжирует и фильтрует. Осталось три вещи, без которых строка поиска в приложении кажется сломанной: показать, где именно нашлось слово, простить опечатку и подсказать блюдо, пока клиент ещё набирает. Помнишь жалобы из первого урока про «пицу с одной ц»? Сейчас они решатся.
Подсветка
Клиенту полезно видеть, почему блюдо нашлось: в описании «Шампиньоны, белые грибы, моцарелла» искомые слова выделены. Это подсветка: раздел highlight в запросе.
"highlight": { "fields": { "description": {} } }
Elasticsearch вернёт рядом с каждым документом поле highlight с фрагментами, где совпавшие слова обёрнуты в <em>. Подсвечивает он именно совпавшие термины после анализа: найдётся «грибы», а выделятся и «грибами». Теги, длину фрагментов и их число можно настроить: pre_tags, fragment_size, number_of_fragments.
Нечёткий поиск
Опечатка это не другая форма слова, её стеммер не спасёт. «пица» и «пицца» отличаются одной буквой. Мерой «насколько слова похожи» служит расстояние Левенштейна: сколько букв надо вставить, удалить, заменить или переставить, чтобы одно слово стало другим. У «пица» и «пицца» оно равно одному.
Нечёткий поиск включается параметром fuzziness у match:
{ "match": { "name": { "query": "пица с грибам", "fuzziness": "AUTO" } } }
AUTO значит: слова из 1-2 букв без правок, из 3-5 букв с одной правкой, длиннее с двумя. Так короткие слова не превращаются во что попало. Точные совпадения при этом оцениваются выше нечётких. Чтобы нечёткий поиск не был слишком медленным, первые буквы обычно требуют совпадать точно: "prefix_length": 1.
урок из курса
Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.