[Перевод] Новый нечёткий поиск и автодополнение в Manticore Search

TL; DR


Мы рады представить две важные новые функции в Manticore Search: простой нечёткий поиск и автокорректировка запросов (или автодополнение). Эти функции делают поиск удобнее и эффективнее для пользователей. Вы можете протестировать их в нашей демонстрации поиска по задачам на GitHub.

Новая функциональность доступна в development версии. Ознакомьтесь с документацией, чтобы узнать, как ее установить.

Введение


Возможно вы уже знакомы с тем, как работает семантический поиск из демо поиска по задачам на GitHub. В этой статье мы хотим рассказать о двух новых функциях: нечётком поиске и автодополнении.

  • Нечёткий поиск помогает находить результаты, даже при небольших ошибках в запросе.

  • Автодополнение предлагает подходящие запросы во время набора, ускоряя поиск.

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

Реализация нечёткого поиска

В чём проблема с опечатками?


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

Старый метод нечёткого поиска через CALL QSUGGEST


Ранее в Manticore Search за неимением другого использовались методы CALL QSUGGEST и CALL SUGGEST для нечёткого поиска. Они достаточно эффективны, но имеют ограничения. Например, CALL QSUGGEST позволяет находить последнее слово в запросе с помощью расстояния Левенштейна, что делает поиск более устойчивым к опечаткам, но только для последнего слова. Второй метод работает только для первого слова в запросе. Пример с использованием клиента Manticore на PHP:

$params = [
    'index' => 'issue',
    'body' => [
        'query'=> 'fzzy',
        'options' => [
            'limit' => 10,
            'max_edits' => 2,
        ],
    ],
];
$response = $client->suggest($params);

В этом примере клиент использует функцию CALL SUGGEST, чтобы найти предложения для неправильно написанного слова «fzzy». Параметр max_edits управляет максимальным допустимым расстоянием Левенштейна между введенным словом и предложенными вариантами. Расстояние Левенштейна — это минимальное количество операций (вставок, удалений или замен символов), необходимых для превращения одного слова в другое. Установив max_edits в 2, мы допускаем до двух ошибок в слове, что позволяет находить опечатки и похожие слова.

Хотя этот подход работает, он требует дополнительной обработки вручную. К тому же, CALL QSUGGEST не учитывает ошибки при смене раскладки клавиатуры (об этом мы поговорим позже). Чтобы сделать нечёткий поиск более удобным, мы и добавили в Manticore Search новую опцию для запроса на выборку результатов, которая позволяет использовать нечёткий поиск с определёнными параметрами без необходимости писать дополнительный код.

Новый упрощенный нечёткий поиск


Теперь у нас есть более простой вариант. Просто добавив fuzzy=1 в параметры запроса, вы можете легко включить нечёткий поиск.

Вот пример:

$client = new Client();
$index = $client->index('issues');

$query = 'fzzy serch';
$result = $index->search($query)->option('fuzzy', 1)->get();

foreach ($result as $hit) {
    echo $hit->getTitle() . "\n";
}

Этот код включает нечёткий поиск для неправильно введенной фразы «fzzy serch», позволяя Manticore найти «fuzzy search». Посмотрите, как это выглядит в демо на GitHub:

ae2b86e4218049e06bef9468e9bbcc94.png

Больше информации о нечетком поиске можно найти в документации.

Реализация предложений запросов (автодополнение)

Сила предсказательного поиска


Предложения запросов или автодополнение делают поиск быстрее и помогают пользователям находить релевантные запросы, которые они могли не учитывать:

d67bca0d0c3dfaadfebf55f5e66cdcaf.png

Старое автодополнение с CALL KEYWORDS

Так же как и CALL QSUGGEST для нечёткого поиска, в Manticore Search исторически существовал метод CALL KEYWORDS для реализации автодополнения. Этот метод позволяет выполнять префиксный и инфиксный поиск по ключевым словам в таблице, обеспечивая эффективный способ для внедрения автодополнения. Однако, он не поддерживает опечатки, что значит, что при ошибке пользователя система не предложит ключевые слова. Вот пример использования этого метода в клиенте Manticore на PHP:

$index = 'myindex';
$query = 'pref*';

$response = $client->keywords($index, $query);

foreach ($response as $keyword) {
    echo $keyword['normalized'] . ' (docs: ' . $keyword['docs'] . ', hits: ' . $keyword['hits'] . ")\n";
}

В этом примере мы используем метод CALL KEYWORDS, чтобы найти все ключевые слова в таблице myindex, которые начинаются с pref. Звездочка (*) в конце указывает на префиксное совпадение. Можно также использовать инфиксное совпадение, поставив звездочки с обеих сторон термина, например *some*.

Хотя этот метод быстр и прост в реализации автодополнения, он не настолько гибок, как нечёткий поиск. Для точного поиска требуется точное совпадение префикса или инфикса, что подходит для случаев, где нужно предлагать конкретные ключевые слова. Новый метод автодополнения решает и эту проблему.

Новый метод автодополнения CALL AUTOCOMPLETE


Мы ввели новый метод, который создает предложения на основе нескольких введенных слов и поддерживает опечатки. Этот метод сочетает функции CALL KEYWORDS и CALL QSUGGEST.

Пример использования нового автодополнения в клиенте PHP:

$client = new Client();
$result = $client->autocomplete([
    'body' => [
        'table' => 'issues',
        'query' => 'hllo wor',
        'options' => [
            'fuzziness' => 1,
            'layouts' => ['us', 'ru'],
        ],
    ],
]);

foreach ($result[0]['data'] as $suggestion) {
    echo $suggestion . "\n";
}

Этот код предлагает «hello world» для введенного «hllo wor», учитывая опечатки и ошибки раскладки клавиатуры.

Как это работает внутри: мы используем логику нечёткого поиска для создания релевантных предложений. Метод использует низкоуровневые функции CALL KEYWORDS и CALL QSUGGEST, чтобы сгенерировать варианты из вашего набора данных.

Для точных предложений мы оцениваем расстояние на основе длины слова и количества доступных документов. Например, если пользователь вводит «hllo wor», а в данных есть «hello world», система предложит именно «hello world», благодаря нечёткому поиску. Такой подход позволяет пользователям получать точные предложения даже с опечатками.

Больше информации об автодополнении можно найти в документации.

Определение раскладки клавиатуры

Теперь Manticore умеет определять раскладку клавиатуры. Это особенно полезно для пользователей, которые случайно переключают раскладку при вводе. Система поддерживает популярные раскладки, включая языковые и QWERTY, что позволяет устранить ошибки ввода.

Преимущества:

  • Повышенная точность поиска для многоязычных пользователей

  • Устранение ошибок из-за переключения раскладки

  • Бесшовная интеграция с нечетким поиском и автодополнением

Применение новых функций в демонстрации поиска по задачам на GitHub

С этими новыми функциями мы с удовольствием улучшили наше демо поиска по задачам на GitHub. Сделать это оказалось несложно:

Чтобы включить нечёткий поиск, мы добавили следующие строки в запрос:

$search->option('fuzzy', 1);
$search->option('layouts', ['ru', 'us', 'ua']);

Для предложений запросов мы использовали новую функцию автодополнения:

$result = $client->autocomplete([
    'body' => [
        'table' => $table,
        'query' => $query,
        'options' => [
            'fuzziness' => 1,
            'layouts' => ['ru', 'ua', 'us'],
        ],
    ],
]);

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

Вот как это выглядит в демо поиска по задачам на GitHub

Интеграция автодополнения и нечеткого поиска с учетом раскладки клавиатуры с использованием Manticore Search улучшает взаимодействие пользователей с инструментом поиска. Благодаря учёту опечаток и предложению вариантов по шаблонам ввода, пользователи могут быстрее находить нужные результаты.

Вот пример работы автодополнения, напоминающего популярные интерфейсы поиска:

78252e5a71fec7d5f0968f0e298a02e7.png

Кроме того, нечёткий поиск улучшает взаимодействие с пользователем, исправляя частые ошибки, такие как опечатки. Например, если пользователь ищет продукт, но допускает ошибку, нечёткий поиск всё равно найдёт подходящие результаты. Вот как это выглядит в демонстрации поиска по задачам на GitHub:

58211e50356e553b3e6fe01c7367e5e4.png

Заключение

Интеграция нечеткого поиска и предложений запросов в Manticore Search значительно расширила его возможности. Эти функции делают поиск более интуитивным, гибким и эффективным.

Последнюю версию можно найти в предварительном development релизе. Ознакомьтесь с документацией, чтобы установить его и воспользоваться новыми возможностями.

Мы также приглашаем вас попробовать эти функции онлайн в нашей демонстрации поиска по задачам на GitHub и поделиться своим мнением. Ваши отзывы помогают нам улучшать Manticore Search.

Следите за обновлениями и, если проект вам понравится, поддержите наш репозиторий на GitHub!

© Habrahabr.ru