blog-post

Вы имели в виду

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

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

Рабочий пример


Простой рабочий пример ‘Did you mean’ можно увидеть в Веб-панели нашего интерактивного курса.

PHP-скрипт предоставляет простую страницу результатов поиска.

В случае, если входная строка не находит результат, скрипт проверяет каждое слово с помощью ‘CALL SUGGEST’ и пытается построить новую строку запроса.

Если новая строка запроса совпала, предоставляется его набор результатов.

Скрипт можно просмотреть с помощью cat /html/index.php

root@didyoumean-b85fb586f-2nvh2:/tutorial# cat /html/index.php

Если вам кажется, что чего-то не хватает, попробуйте курс , прочитайте документацию или задайте вопрос в сообществе.

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

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