Помимо функции автозаполнения, для которой мы рассмотрели простой пример в этом курсе , еще одной распространенной функцией, которую люди добавляют в поисковые приложения, является возможность показывать исправления неправильно набранных слов.
Manticore Search предлагает функцию, которая позволяет получать предложения для слова из словаря индекса.
Это можно сделать, включив опцию инфиксации. Инфиксация не только позволяет выполнять поиски с подстановочными знаками, но и создает хеши n-грамм из индексированных слов.
N-граммы (или просто части слов длиной N символов) используются для нахождения слов, которые близки друг к другу (в виде обычного текста, а не с лингвистической точки зрения). В сочетании с расстоянием Левенштейна между кандидатом на предложение и оригинальным словом, мы можем предоставить предложения, которые подходят в качестве исправлений для неправильного слова. Эта функциональность предоставляется функциями CALL SUGGEST и CALL QSUGGEST ( читайте больше в документации).
Итак, давайте начнем обзор того, как это работает в Manticore Search ниже, или вы можете попробовать это самостоятельно в нашем интерактивном курсе .
Сначала мы должны включить инфиксацию в нашем индексе.
index movies
{
type = plain
path = /var/lib/manticore/data/movies
source = movies
min_infix_len = 3
}
Использование CALL SUGGEST
Когда пользователь выполняет запрос, который не возвращает результатов, возможно, что пользователь мог что-то неправильно ввести.
Давайте подключимся к Manticore и возьмем пример (обратите внимание на ошибку в 'revenge'):
mysql -P9306 -h0
root@didyoumean-b85fb586f-2nvh2:/tutorial# mysql -P9306 -h0
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 3.2.0 e526a014@191017 release
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
И приведем быстрый пример предложения слова:
CALL SUGGEST('rvenge','movies');
MySQL [(none)]> CALL SUGGEST('rvenge','movies');
+---------+----------+------+
| suggest | distance | docs |
+---------+----------+------+
| revenge | 1 | 77 |
| range | 2 | 5 |
| avenger | 2 | 3 |
| avenged | 2 | 1 |
| event | 3 | 9 |
+---------+----------+------+
5 rows in set (0.00 sec)
Вывод содержит 3 колонки: предложение, рассчитанное расстояние Левенштейна и количество документов с предложениями в индексе.
Первое предложение имеет расстояние 1 по сравнению с нашим вводом, и это фактическое слово, которое ожидается в качестве предложения.
Это обычно лучший сценарий, когда мы получаем на минимальном расстоянии одно предложение, так как это, скорее всего, то, что мы ищем.
Возможно даже, что при расстоянии 1 будет больше одного предложения:
CALL SUGGEST('aprentice','movies');
MySQL [(none)]> CALL SUGGEST('aprentice','movies');
+------------+----------+------+
| suggest | distance | docs |
+------------+----------+------+
| apprentice | 1 | 6 |
| prentice | 1 | 1 |
| practice | 3 | 5 |
| argentine | 3 | 1 |
| prestige | 3 | 1 |
+------------+----------+------+
5 rows in set (0.00 sec)
Когда они имеют одинаковое расстояние, предложения сортируются снова по количеству документов.
В этом примере 'apprentice' скорее всего то, что хотел пользователь, так как у него больше упоминаний, чем у 'prentice'.
Конечно, когда вводимое слово фактически найдено в нашем индексе, оно появится в качестве первого предложения с расстоянием=0
CALL SUGGEST('revenge','movies');
MySQL [(none)]> CALL SUGGEST('revenge','movies');
+----------+----------+------+
| suggest | distance | docs |
+----------+----------+------+
| revenge | 0 | 77 |
| reverse | 2 | 2 |
| revelle | 2 | 1 |
| seven | 3 | 11 |
| berenger | 3 | 9 |
+----------+----------+------+
5 rows in set (0.01 sec)
Если мы хотим увеличить количество предложений, мы можем добавить параметр limit:
CALL SUGGEST('aprentice','movies', 10 as limit);
MySQL [(none)]> CALL SUGGEST('aprentice','movies', 10 as limit);
+------------+----------+------+
| suggest | distance | docs |
+------------+----------+------+
| apprentice | 1 | 6 |
| prentice | 1 | 1 |
| practice | 3 | 5 |
| argentine | 3 | 1 |
| prestige | 3 | 1 |
| adventure | 4 | 894 |
| lawrence | 4 | 43 |
| laurence | 4 | 10 |
| terence | 4 | 9 |
| prejudice | 4 | 9 |
+------------+----------+------+
10 rows in set (0.00 sec)
Если мы хотим ограничить предложения, мы можем уменьшить максимальное расстояние Левенштейна (по умолчанию 4) и максимальную длину слова (по умолчанию 3):
CALL SUGGEST('aprentice','movies', 10 as limit,3 as max_edits,2 as delta_len);
MySQL [(none)]> CALL SUGGEST('aprentice','movies', 10 as limit,3 as max_ dits,2 as delta_len);
+------------+----------+------+
| suggest | distance | docs |
+------------+----------+------+
| apprentice | 1 | 6 |
| prentice | 1 | 1 |
| practice | 3 | 5 |
| argentine | 3 | 1 |
| prestige | 3 | 1 |
+------------+----------+------+
5 rows in set (0.00 sec)
На следующем шаге нам нужно выйти из клиента MySQL
exit;
MySQL [(none)]> exit;
Bye
Рабочий пример
Простой рабочий пример 'Вы имели в виду' можно увидеть в веб-панели нашего интерактивного курса.
PHP-скрипт предоставляет простую страницу результатов поиска.
В случае, если входная строка не находит результат, скрипт тестирует каждое слово с 'CALL SUGGEST' и пытается построить новую строку запроса.
Если новая строка запроса совпадает, предоставляется ее набор результатов.
Скрипт можно просмотреть с помощью cat /html/index.php
root@didyoumean-b85fb586f-2nvh2:/tutorial# cat /html/index.php
Если вы чувствуете, что чего-то не хватает, попробуйте курс , прочитайте документацию или спросите в сообществе.
