blog-post

Автозаполнение: Сделаем поиск более удобным для пользователей

Введение

Автозаполнение может показаться небольшой функцией, но оно имеет огромное значение. Оно экономит время на набор текста, помогает людям быстрее находить то, что они хотят, и предотвращает поиски с результатом “нет результатов”.

Эта статья является практическим руководством по созданию автозаполнения с Manticore Search. Вы увидите, как использовать:

  • CALL AUTOCOMPLETE и HTTP-эндпоинт /autocomplete
  • быстрые словарные запросы с помощью CALL KEYWORDS
  • завершение предложений с использованием инфиксного поиска и подсветки
  • практические советы по запуску автозаполнения в производственной среде

Автозаполнение в действии

Кто должен это читать

Это руководство предназначено для разработчиков, добавляющих поисковые подсказки в интернет-магазин, сайт документации или внутренний инструмент — особенно если вы используете или планируете использовать Manticore Search. Примеры практические и могут быть опробованы непосредственно на ваших данных.

Быстрый справочник по решениям

  • Используйте CALL AUTOCOMPLETE (или POST /autocomplete) когда вам нужны подсказки с учетом опечаток и многословные предложения из индексированных данных.
  • Используйте CALL KEYWORDS когда вам нужны молниеносные, словарные завершения для одиночных слов или очень коротких фраз.
  • Используйте инфиксный поиск с подсветкой когда вам нужны подсказки на уровне фраз или предложений (например, показывая остальную часть предложения документа).
  • Включите bigram_index если вы хотите предсказания из двух слов (предсказание “следующего слова”).

Предварительные условия и предостережения

  • Buddy необходим для CALL AUTOCOMPLETE и HTTP-эндпоинта /autocomplete. Если Buddy не установлен, эти вызовы не будут работать.
  • Целевая таблица должна иметь включенные инфиксы (min_infix_len). Manticore кэширует проверку min_infix_len на ~30 секунд для повышения производительности; если вы измените min_infix_len (например, при настройке производительности поиска или включении автозаполнения на существующей таблице), вы можете увидеть кратковременную несоответствие в течение этого времени.
  • CALL AUTOCOMPLETE кэширует только успешные проверки. Если вы отключите min_infix_len или удалите таблицу, последующие вызовы автозаполнения могут работать с устаревшими данными, пока кэш не обновится или не появится ошибка.

CALL AUTOCOMPLETE — быстрый пример (SQL)

Это самый прямой способ получить кандидатов на подсказки из вашего индекса.

CALL AUTOCOMPLETE('ice', 'products');

Типичный набор результатов содержит строки с единственным столбцом, названным query:

+---------------+
| query         |
+---------------+
| ice           |
| ice cream     |
| iceberg       |
| iceland       |
+---------------+

Как работает CALL AUTOCOMPLETE (кратко)

CALL AUTOCOMPLETE — это высокоуровневая удобная функция, которая координирует несколько низкоуровневых примитивов внутри Manticore для получения быстрых, релевантных подсказок. На практике она сочетает:

  • CALL KEYWORDS: быстрые словарные запросы, которые возвращают кандидатов на токены префикса/инфикса и статистику (docs/hits). Это то, что дает автозаполнению сильных, с низкой задержкой кандидатов из словарного индекса.
  • Рутины подсказок (исторически доступные через CALL SUGGEST / CALL QSUGGEST): рутины, которые производят нечеткие варианты для токенов (особенно последнего слова) и помогают генерировать альтернативы с учетом опечаток.
  • Логику нечеткого поиска: ту же метрику редактирования (Левенштейна) и эвристики ранжирования, введенные для нечеткого поиска, которые поток автозаполнения повторно использует для ранжирования и фильтрации кандидатов.

Эти компоненты работают вместе: ключевые слова предоставляют кандидатов, рутины подсказок/нечеткие расширяют и исправляют их, а нечеткая логика ранжирует/фильтрует результаты по расстоянию и популярности. Угадывание раскладки клавиатуры (когда включено) применяется на раннем этапе, чтобы ввод с ошибками раскладки мог быть исправлен до вычисления нечеткости.

Когда не вызывать CALL KEYWORDS напрямую

CALL KEYWORDS — это отличный, чрезвычайно быстрый инструмент, когда вам нужны строгие словарные завершения (точные совпадения префикса/инфикса). Однако он не предоставляет толерантность к опечаткам или составление многословных подсказок. Для многословных, толерантных к опечаткам подсказок предпочтительнее использовать CALL AUTOCOMPLETE; используйте CALL KEYWORDS для очень коротких префиксов, горячих списков или когда вы явно хотите получить только словарные результаты.

Сопоставление опций (высокий уровень)

  • fuzziness в CALL AUTOCOMPLETE соответствует ограничению расстояния редактирования, аналогичному max_edits в API подсказок.
  • preserve контролирует, сохраняются ли нечеткие токены вместе с нечеткими совпадениями.
  • layouts включает угадывание раскладки клавиатуры перед нечеткой оценкой.

Примечание: внутреннее сочетание примитивов, описанное здесь, отражает подход к реализации, но должно рассматриваться как деталь реализации — полагайтесь на документированное API CALL AUTOCOMPLETE и опции, а не на внутреннее поведение при проектировании вашего приложения.

Эти внутренние комбинации — причина, по которой CALL AUTOCOMPLETE часто дает лучшие, более удобные подсказки, чем выполнение CALL KEYWORDS отдельно.

Пример HTTP/JSON (Buddy)

Если вы предпочитаете HTTP или у вас есть фронтенд, который работает с JSON, используйте эндпоинт /autocomplete, предоставленный Buddy:

POST /autocomplete
{
  "table": "products",
  "query": "ice"
}

Ответ JSON возвращает массив предложенных завершений (и метаданных), которые вы можете представить в пользовательском интерфейсе.

Опции CALL AUTOCOMPLETE объяснены

CALL AUTOCOMPLETE принимает несколько опций для настройки поведения. Вот те, которые вы будете использовать чаще всего:

  • layouts: Коды раскладки клавиатуры, разделенные запятыми (us, ru, ua, de, fr и т.д.). Используйте это для обнаружения ввода с ошибками раскладки (например, ввод “ghbdtn” на английской раскладке, когда вы имели в виду ввести “привет” - русский для “hello”). Требуется как минимум две раскладки для сравнения позиций символов.
  • fuzziness: 0, 1 или 2 (по умолчанию 2). Максимальное расстояние Левенштейна для совпадения опечаток. Установите 0, чтобы отключить нечеткость.
  • preserve: 0 или 1 (по умолчанию 0). Если 1, подсказки будут включать слова, которые не получили нечеткие совпадения (полезно для сохранения собственных имен или коротких токенов).
  • prepend / append: Логическое значение (0/1). Если истинно, то перед/после последнего слова добавляется звездочка для расширения префиксов/суффиксов (например, prepend -> *слово, append -> слово*).
  • expansion_len: Количество символов для расширения последнего токена (по умолчанию 10). Управляет тем, сколько символов будет учитываться для расширения.

Пример с опциями (SQL)

CALL AUTOCOMPLETE('ghbdtn', 'comments', 'layouts=us,ru', 'fuzziness=1');

Это обнаружит, что “ghbdtn” является ошибочно напечатанной версией “привет” и применит нечеткое соответствие для нахождения правильных предложений.


КЛЮЧЕВЫЕ СЛОВА — дополнения на основе токенов

Когда вам нужно только предлагать отдельные слова (или окончания) и хотите максимальную скорость, CALL KEYWORDS является отличной альтернативой. Он использует индексный словарь, а не сканирует документы, что делает его очень эффективным.

Основной синтаксис:

CALL KEYWORDS('ca*', 'products', 1 AS stats, 'hits' AS sort_mode);

Это возвращает строки с tokenized и normalized формами и необязательной статистикой (docs, hits). Сортировка по hits выводит самые популярные дополнения.

Пример результата (иллюстративный):

+------+-----------+------------+------+------+
| qpos | tokenized | normalized | docs | hits |
+------+-----------+------------+------+------+
| 1    | ca*       | cat        | 1    | 2    |
| 1    | ca*       | carnivorous| 1    | 1    |
+------+-----------+------------+------+------+

трюк с bigram_index

Если в вашей таблице включен bigram_index, индекс хранит пары соседних слов в качестве токенов. Это позволяет вам предлагать вероятные следующие слова (“предсказать следующее слово”), а не только завершать текущий токен. Это простой, но мощный способ улучшить многословные предложения без добавления внешней модели машинного обучения.


Завершение предложений с помощью инфиксного поиска и выделения

Для завершения фраз или окончаний предложений (например, автозавершение остатка предложения из документа) используйте инфиксные запросы с подстановочными знаками и выделяйте совпадение. Например, чтобы найти документы, где поле начинается с введенного фрагмента:

  • Примеры запросов, которые вы можете вводить по мере ввода:
    • ^"m*"
    • ^"my *"
    • ^"my c*"
    • ^"my ca*"

Используйте якорь ^, чтобы соответствовать с начала, и *, чтобы расширить остальное. С включенным выделением вы можете извлечь совпадающую часть и представить ее в качестве предложения (например: “Мой кот любит …”).

Этот подход лучше всего подходит, когда вы хотите предложения, которые являются полными фразами или фрагментами документов, а не изолированными токенами.


Шаблон интеграции (frontend → backend)

Минимальный, удобный для производства поток выглядит так:

  1. Уменьшите частоту ввода пользователя (150–300 мс), чтобы избежать слишком большого количества запросов.
  2. Для 1–2 символов используйте CALL KEYWORDS или горячий список.
  3. Для 3+ символов вызывайте /autocomplete или CALL AUTOCOMPLETE. Включите соответствующие опции (layouts, fuzziness) в зависимости от ваших пользователей.
  4. Покажите предложения с выделенными совпадениями.
  5. Отслеживайте клики и переупорядочивайте предложения по популярности или бизнес-правилам.

Советы по UX

  • Показывайте 6–10 предложений на настольных ПК, 3–5 на мобильных устройствах.
  • Группируйте по типу (например, продукты, документы, люди), если это уместно.
  • Всегда предлагайте запасной вариант: например, “Поиск по {query}”.

Советы по производству

  • min_infix_len: Убедитесь, что это значение установлено правильно для вашего языка и случая использования. Очень маленькие значения увеличивают размер индекса и использование ЦП; очень большие значения уменьшают гибкость соответствия.
  • Кэширование: позвольте ~30 секунд, чтобы изменения, такие как min_infix_len, вступили в силу.
  • Ограничение скорости: используйте ограничение запросов или кэширование в памяти для интенсивного трафика.
  • Обслуживание индекса: рассмотрите возможность предварительного вычисления таблицы “топ предложений” для самых распространенных префиксов.

Контрольный список по устранению неполадок

Если автозавершение ведет себя неожиданно:

  1. Убедитесь, что Buddy установлен (если используете /autocomplete).
  2. Подтвердите, что в таблице установлено значение min_infix_len и включены инфиксы.
  3. Повторите попытку через 30 секунд, чтобы позволить внутреннему кэшу обновиться, если вы недавно изменили настройки таблицы.
  4. Попробуйте CALL KEYWORDS для того же префикса, чтобы убедиться, что токены существуют в словаре.
  5. Проверьте настройки кодирования и токенизации (morphology, stopwords), которые могут повлиять на результаты.

Пример: полный поток (образец)

Пользователь вводит: “ice c”

Клиент (с задержкой) отправляет:

POST /autocomplete
{
  "table": "products",
  "query": "ice c",
  "options": { "fuzziness": 1 }
}

Сервер возвращает предложения, такие как “ice cream”, “ice coffee”, “ice cold”. UI показывает их; при выборе клиент переходит на URL поиска, такой как /search?q=ice+cream, или получает детали продукта, используя выбранное предложение.


Заключение

Автозавершение — это небольшая функция UX, которая приносит значительную ценность: более быстрые поиски, меньше тупиков и более высокая удовлетворенность пользователей. С Manticore Search у вас есть практические варианты для реализации предложений — от быстрого, основанного на словаре CALL KEYWORDS до более гибкого, допускающего опечатки CALL AUTOCOMPLETE (и HTTP /autocomplete конечной точки через Buddy). Используйте описанные здесь подходы, чтобы сбалансировать задержку, точность и стоимость ресурсов для вашего приложения.

Попробуйте примеры в этой статье с вашим индексом, отслеживайте качество предложений и настраивайте такие параметры, как fuzziness и min_infix_len, чтобы соответствовать вашим данным и пользователям. Если вам нужна легкая отправная точка, создайте короткий горячий список для самых распространенных префиксов и направляйте более длинные вводы через CALL AUTOCOMPLETE.

Создавайте более умный и быстрый поиск с автозавершением.

Установить Manticore Search

Установить Manticore Search