Користувач чекає відповіді від автодоповнення понад 200 мс? Це вбиває UX. В одному проекті інтернет-магазину електроніки кожен введений символ породжував запит з повнотекстовим пошуком по базі. Навантаження на сервер зростало, швидкість падала, клієнти йшли. Рішення — Elasticsearch Completion Suggester. Цей механізм на основі FST (Finite State Transducer) зберігає дані в пам'яті і видає відповідь за 1–5 мс. Ми впровадили його в більш ніж 50 проектах за 10+ років і гарантуємо стабільну роботу під навантаженням.
Схема роботи: ви вводите «но» — система повертає «ноутбук», «носки», «ноябрь» без затримки. Completion Suggester використовує поле типу completion, яке містить масив input (варіанти автодоповнення) і необов'язковий weight (вага для пріоритету). Для популярних товарів вага виставляється на основі продажів або кліків.
Як працює Completion Suggester?
Completion Suggester — найшвидший варіант, але менш гнучкий: немає повнотекстового скорингу, обмежена фільтрація. Маппінг поля completion:
PUT /products { "mappings": { "properties": { "title": { "type": "text" }, "suggest": { "type": "completion", "analyzer": "simple", "search_analyzer": "simple", "preserve_separators": true, "preserve_position_increments": true, "max_input_length": 50 } } } } Індексація документа:
PUT /products/_doc/1 { "title": "Ноутбук ASUS VivoBook 15", "suggest": { "input": ["Ноутбук ASUS VivoBook", "ASUS VivoBook 15", "VivoBook"], "weight": 10 } } Запит автодоповнення з fuzzy:
POST /products/_search { "suggest": { "product-suggest": { "prefix": "ноут", "completion": { "field": "suggest", "size": 5, "skip_duplicates": true, "fuzzy": { "fuzziness": 1 } } } }, "_source": ["title", "price"], "size": 0 } Відповідь повертає варіанти з полями _source. Час відповіді — 1–5 мс.
Як вибрати між Completion Suggester та Edge N-gram?
Вибір залежить від пріоритету: швидкість проти гнучкості. Completion Suggester в 10 разів швидший за Edge N-gram при однаковому навантаженні — це підтверджено нашими навантажувальними тестами. Якщо дані статичні (каталог товарів, список міст) і потрібна максимальна швидкість — беріть Completion Suggester. Якщо потрібен повнотекстовий пошук з фільтрацією та сортуванням — Edge N-gram.
Що таке Context Suggester?
Context Suggester розширює Completion Suggester фільтрацією за контекстом — наприклад, за категорією товару. Маппінг з контекстом:
PUT /products { "mappings": { "properties": { "suggest": { "type": "completion", "contexts": [ { "name": "category", "type": "category", "path": "category" } ] }, "category": { "type": "keyword" } } } } Індексація з контекстом:
PUT /products/_doc/1 { "title": "Ноутбук ASUS", "category": "laptops", "suggest": { "input": ["Ноутбук ASUS", "ASUS"], "contexts": { "category": ["laptops"] } } } Запит з контекстом та boost:
POST /products/_search { "suggest": { "product-suggest": { "prefix": "ас", "completion": { "field": "suggest", "size": 5, "contexts": { "category": [ { "context": "laptops", "boost": 2 }, { "context": "tablets" } ] } } } } } Context Suggester підвищує релевантність: якщо користувач у розділі «Ноутбуки», саджести показують лише ноутбуки. В одному проекті ми отримали зростання клікабельності саджестів на 30% завдяки точності.
Edge N-gram: альтернатива з повнотекстовим пошуком
Edge N-gram індексує часткові токени (мінімальна довжина 2 символи) і використовує стандартний match-запит з повним скорингом TF/IDF, фільтрацією та сортуванням. Приклад маппінгу:
PUT /products { "settings": { "analysis": { "tokenizer": { "edge_ngram_tokenizer": { "type": "edge_ngram", "min_gram": 2, "max_gram": 20, "token_chars": ["letter", "digit"] } }, "analyzer": { "autocomplete_index": { "type": "custom", "tokenizer": "edge_ngram_tokenizer", "filter": ["lowercase"] }, "autocomplete_search": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase"] } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "autocomplete_index", "search_analyzer": "autocomplete_search" } } } } Запит:
POST /products/_search { "query": { "match": { "title": { "query": "ноут", "operator": "and" } } }, "sort": [{ "_score": "desc" }], "size": 5 } | Характеристика | Completion Suggester | Edge N-gram |
|---|---|---|
| Швидкість відповіді | 1–5 мс | 10–50 мс |
| Гнучкість запитів | Обмежена (prefix) | Повна (match, фільтрація, сортування) |
| Споживання пам'яті | Високе (FST) | Середнє (інвертований індекс) |
| Підтримка помилок | Вбудований fuzzy | Потрібен окремий аналізатор |
| Найкраще застосування | Статичні дані з вагами | Динамічні дані з повнотекстовим пошуком |
Типові помилки при налаштуванні автодоповнення
- Забувають про
skip_duplicates: якщо не включити, можливі дублі варіантів. - Не виставляють
max_input_length— за замовчуванням 50, для довгих назв може не вистачити. - Використовують
size: 0в основному запиті, але забувають про_source— повертаються зайві поля. - Не налаштовують debounce на фронтенді: відправка запиту при кожному символі створює лавину запитів. Рекомендуємо затримку 200–300 мс та кешування попередніх результатів.
Реалізація на стороні застосунку
Приклад на PHP з пакетом elasticsearch-php:
public function autocomplete(string $query): array { $response = $this->client->search([ 'index' => 'products', 'body' => [ 'suggest' => [ 'product-suggest' => [ 'prefix' => mb_strtolower($query), 'completion' => [ 'field' => 'suggest', 'size' => 8, 'skip_duplicates' => true, 'fuzzy' => ['fuzziness' => 'AUTO'], ] ] ], '_source' => ['title', 'slug', 'price'], 'size' => 0, ] ]); return array_map(fn($opt) => [ 'title' => $opt['text'], 'url' => '/products/' . $opt['_source']['slug'], 'price' => $opt['_source']['price'], ], $response['suggest']['product-suggest'][0]['options'] ?? []); } На фронтенді обов'язково додайте debounce на 200–300 мс та кешування попередніх результатів, щоб не перевантажувати сервер.
Процес роботи
| Етап | Що робимо | Приблизна тривалість |
|---|---|---|
| Аналітика | Вивчаємо пошукову логіку, навантаження, профіль даних | 0.5 дня |
| Проектування | Вибираємо Completion Suggester або Edge N-gram, проектуємо маппінг з вагами | 0.5 дня |
| Реалізація | Налаштовуємо індекси, пишемо API-ендпоінт та інтеграцію з фронтендом | 1–2 дні |
| Тестування | Перевіряємо швидкість (має бути до 5 мс), точність, навантаження | 0.5 дня |
| Деплой | Розгортаємо на продакшен з моніторингом | 0.5 дня |
Що входить в роботу
- Аналіз вимог та вибір оптимального механізму
- Проектування маппінгу та конфігурація індексів
- Реалізація API-ендпоінту з підтримкою fuzzy та контекстів
- Інтеграція з фронтендом (debounce, кешування)
- Документація та рекомендації щодо подальшої оптимізації
- Гарантія часу відповіді до 5 мс
- Підтримка після впровадження
Терміни
Налаштування Completion Suggester з популяризацією за вагами — 1 робочий день. Додавання Context Suggester з фільтрацією за категоріями — ще півдня. Edge N-gram з повноцінною інтеграцією — 1–2 дні. Вартість розраховується індивідуально. Оцініть свій проект — наші сертифіковані інженери допоможуть підібрати рішення. Отримайте консультацію – просто зв'яжіться з нами.







