⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.
blog-post

Did you mean

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

Manticore Search предоставляет возможность получать предложения для слова из словаря индекса.

Это можно сделать, включив опцию инфиксации. Инфиксация не только позволяет выполнять поиск с подстановочными знаками, но и создаёт n‑граммные хэши из проиндексированных слов.

N‑граммы (или просто части слов длиной N символов) используются для поиска слов, близких друг к другу (как обычный текст, а не лингвистически). В сочетании с расстоянием Левенштейна между словом‑кандидатом предложения и исходным словом мы можем предоставлять предложения, подходящие в качестве исправлений ошибочного слова. Эта функциональность реализована функциями CALL SUGGEST и CALL QSUGGEST ( read more в документации).

Итак, давайте начнём рассматривать, как это работает в Manticore Search ниже, или вы можете попробовать самостоятельно в нашем interactive course .

Сначала нам следует включить инфиксацию в нашем индексе.

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 столбца: предложение, вычисленное расстояние Levenshtein и количество попаданий документов предложений в индексе.

Первое предложение имеет расстояние 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' можно увидеть в Web panel нашего интерактивного курса.

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

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

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

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

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

Если вам кажется, что чего‑то не хватает, попробуйте пройти course , прочитайте documentation или задайте вопрос в community.

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

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