Введение
Автозаполнение может показаться небольшой функцией, но оно имеет огромное значение. Оно экономит время на набор текста, помогает людям быстрее находить то, что они хотят, и предотвращает поиски с результатом “нет результатов”.
Эта статья является практическим руководством по созданию автозаполнения с 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)
Минимальный, удобный для производства поток выглядит так:
- Уменьшите частоту ввода пользователя (150–300 мс), чтобы избежать слишком большого количества запросов.
- Для 1–2 символов используйте
CALL KEYWORDS
или горячий список. - Для 3+ символов вызывайте
/autocomplete
илиCALL AUTOCOMPLETE
. Включите соответствующие опции (layouts
,fuzziness
) в зависимости от ваших пользователей. - Покажите предложения с выделенными совпадениями.
- Отслеживайте клики и переупорядочивайте предложения по популярности или бизнес-правилам.
Советы по UX
- Показывайте 6–10 предложений на настольных ПК, 3–5 на мобильных устройствах.
- Группируйте по типу (например, продукты, документы, люди), если это уместно.
- Всегда предлагайте запасной вариант: например, “Поиск по {query}”.
Советы по производству
min_infix_len
: Убедитесь, что это значение установлено правильно для вашего языка и случая использования. Очень маленькие значения увеличивают размер индекса и использование ЦП; очень большие значения уменьшают гибкость соответствия.- Кэширование: позвольте ~30 секунд, чтобы изменения, такие как min_infix_len, вступили в силу.
- Ограничение скорости: используйте ограничение запросов или кэширование в памяти для интенсивного трафика.
- Обслуживание индекса: рассмотрите возможность предварительного вычисления таблицы “топ предложений” для самых распространенных префиксов.
Контрольный список по устранению неполадок
Если автозавершение ведет себя неожиданно:
- Убедитесь, что Buddy установлен (если используете
/autocomplete
). - Подтвердите, что в таблице установлено значение
min_infix_len
и включены инфиксы. - Повторите попытку через 30 секунд, чтобы позволить внутреннему кэшу обновиться, если вы недавно изменили настройки таблицы.
- Попробуйте
CALL KEYWORDS
для того же префикса, чтобы убедиться, что токены существуют в словаре. - Проверьте настройки кодирования и токенизации (
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
.
Создавайте более умный и быстрый поиск с автозавершением.