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







