Пользователь ждёт ответа от автодополнения по 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 дня. Стоимость рассчитывается индивидуально. Оцените свой проект — наши сертифицированные инженеры помогут подобрать решение. Получите консультацию – просто свяжитесь с нами.







