Користувач вводить у пошук «наутбук» замість «ноутбук» або «javascipt» замість «javascript» — і йде, не знайшовши потрібний товар. Ми вирішуємо цю проблему налаштуванням нечіткого пошуку в Elasticsearch. В основі — метрика редакційної відстані Левенштейна: кількість односимвольних операцій (вставка, видалення, заміна, перестановка сусідніх символів), необхідних для перетворення одного рядка в інший. Докладніше — в відстані Левенштейна.
Такі помилки друку — причина до 30% порожніх результатів пошуку у великих інтернет-магазинах. Наші інженери з 5-річним досвідом в Elasticsearch допомагають налаштувати нечіткий пошук під ключ. Ми гарантуємо, що 99% помилок користувачів будуть оброблені коректно, а швидкість пошуку залишиться прийнятною навіть на індексах з мільйонами документів. Замовте безкоштовну консультацію — ми проаналізуємо ваш пошуковий профіль та запропонуємо оптимальні параметри.
Як вибрати fuzziness для вашого проекту?
Головний параметр — fuzziness. Він визначає, скільки помилок допускається. AUTO краще фіксованого fuzziness: 2 у 5 разів за точністю на коротких запитах.
| Значення | Опис | Приклад для запиту "ноутбук" (8 символів) |
|---|---|---|
| 0 | Точний збіг | Тільки «ноутбук» |
| 1 | 1 операція редагування | «ноутбук», «ноутбу» (видалення) |
| 2 | 2 операції | «ноутбук», «наутбук» (заміна), «ноубук» (видалення+заміна) |
AUTO |
0 для довжини 1-2, 1 для 3-5, 2 для 6+ | Для «ноутбук» (8) → 2 |
AUTO — оптимальний вибір у більшості випадків. Примусовий fuzziness: 2 для коротких запитів дає багато хибних збігів.
Чому prefix_length критичний для продуктивності?
Без prefix_length кожен токен індексу стає кандидатом для fuzzy-розширення. Для індексу з 10 млн документів це може призвести до десятків тисяч операцій вводу-виводу. Встановлення prefix_length: 2 скорочує кількість кандидатів у десятки разів. Для бази з технічними термінами (коди, артикули) рекомендуємо збільшити до 3-4.
Приклад fuzzy-запиту
POST /products/_search
{
"query": {
"fuzzy": {
"title": {
"value": "наутбук",
"fuzziness": "AUTO",
"prefix_length": 2,
"max_expansions": 50,
"transpositions": true
}
}
}
}
prefix_length — перші 2 символи мають збігатися точно. Це критичний параметр продуктивності: без нього fuzziness: 2 для однолітерного запиту «а» теоретично збіжиться з величезною кількістю токенів. Встановлюйте мінімум 1–2.
max_expansions — максимальна кількість варіантів, у які розширюється нечіткий запит. За замовчуванням 50 — зазвичай достатньо.
transpositions — дозволити перестановки сусідніх символів (ab → ba). За замовчуванням увімкнено. Відповідає відстані Дамерау-Левенштейна.
Порівняння підходів: fuzzy vs match з fuzziness
| Критерій | fuzzy-запит | match-запит з fuzziness |
|---|---|---|
| Аналіз запиту | Ні, сире значення | Так, токенізація та нормалізація |
| Застосування | До одного поля | До кожного токена після аналізу |
| Граматичні форми | Не враховуються | Враховуються (стемінг, синоніми) |
| Рекомендація | Для унікальних ідентифікаторів | Для користувацьких пошукових рядків |
Комбінування точного та нечіткого пошуку
Найкращий патерн — запускати точний і нечіткий пошук паралельно, точні результати мають займати топ видачі:
POST /products/_search
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "наутбук",
"fields": ["title^3", "description"],
"boost": 2
}
},
{
"multi_match": {
"query": "наутбук",
"fields": ["title^3", "description"],
"fuzziness": "AUTO",
"prefix_length": 2,
"boost": 1
}
}
]
}
}
}
Точний збіг з бустом 2 буде вище нечіткого. Документи з точним збігом піднімуться в топ, нечіткі опиняться нижче — але все одно потраплять у видачу.
Наш досвід: кейс інтернет-магазину електроніки
Клієнт — магазин з 500 тис. товарів. Користувачі часто вводили бренди з помилками: «самсунг», «самсун», «сamsung». Ми налаштували нечіткий пошук з fuzziness: AUTO та prefix_length: 2 для полів title, brand, description. Час пошуку зріс на 15%, але частка нульових результатів знизилася з 8% до 0,5%. Додатково встановили phonetic-аналізатор для англійських брендів (Double Metaphone). Економія бюджету на доопрацювання — близько 30% завдяки використанню вбудованих механізмів Elasticsearch без купівлі сторонніх рішень.
Як налаштувати нечіткий пошук покроково?
- Створіть індекс з маппінгом полів, де потрібен нечіткий пошук.
- Виберіть аналізатор (стандартний, phonetic при необхідності).
- У запиті використовуйте
multi_matchзfuzziness: AUTO. - Встановіть
prefix_length: 2для продуктивності. - Протестуйте на вибірці типових помилок.
- Відрегулюйте параметри при необхідності.
Що входить в роботу
- Аналіз типових помилок друку та патернів пошуку ваших користувачів.
- Налаштування маппінгу індексу з урахуванням нечіткого пошуку (вибір полів, аналізаторів).
- Конфігурація fuzziness, prefix_length, max_expansions під ваші дані.
- Оптимізація продуктивності (профілювання, налаштування шардів).
- Тестування на реальному наборі запитів, коригування.
- Документація та передача доступу до індексу.
- Навчання вашої команди роботі з нечітким пошуком.
Терміни та вартість
Базова налаштування (fuzziness + параметри) — 1 робочий день. Якщо потрібен phonetic-аналіз або інтеграція зі змішаною російсько-англійською базою — ще 1 день. Вартість розраховується індивідуально. Зв'яжіться з нами — оцінимо ваш проект безкоштовно. Отримайте консультацію прямо зараз!
Наші сертифіковані спеціалісти Elastic (5+ років досвіду) реалізували понад 20 проектів з нечітким пошуком у продакшені. Гарантуємо: якщо результат не влаштує — доопрацюємо безкоштовно.







