Користувач чекає відповіді від автодоповнення понад 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 дні. Вартість розраховується індивідуально. Оцініть свій проект — наші сертифіковані інженери допоможуть підібрати рішення. Отримайте консультацію – просто зв'яжіться з нами.







