Допустить опечатки в словах

WHERE MATCH('@title "Долларов"/0.3')

В результате вытащит записи из таблицы те, у которых присутствует фраза Долларов

Пользователь делает опечатку , результата, нет.

При генерации таблицы, выставил

index indexnews {
  type   = plain
  source = sourcename
  path   = /var/lib/manticore/indexnews
  morphology = lemmatize_ru,lemmatize_en,lemmatize_de
  min_word_len = 3
  min_infix_len = 2
  enable_star = 1
}

sudo indexer --all --rotate

Далее

WHERE MATCH('@title "*Доларов*"/0.3')

Просто убрал одну “л”, ничего не нашел.

Как выполнить так, чтобы допустим, пользователь ввел определенную фразу с опечатками и мантикоре нашла эту запись.

Как вариант, через php разбить фразу на слова и прописать так

WHERE MATCH('@title "Фраза~1 которую~1 вбил~1 в поиск~1"/0.3')

Допускаем по 1 опечатки на слово, допускаем опечатки и находим записи схожесть которых от 30%.

Чуть сложнее, не известно, будет ли работать. Может есть проще решение?

Здравствуйте. Попробуйте fuzzy search - Mastering Fuzzy Search with Manticore Search

1 Like

Для работы с fuzzy search, необходим Manticore Buddy

Что такое Manticore Buddy. это веб интерфейс как phpmyadmin?

Для установки, требуется docker и compressor. Которыми не пользуюсь, хотел бы самостоятельно разобраться как верно выставить зависимости к php

Скачал архив: GitHub - manticoresoftware/manticoresearch-buddy: Manticore Buddy is a Manticore Search's sidecar which helps it with various tasks

Папка src, содержит тоже самое что на сервере по пути /usr/share/manticore/modules/manticore-buddy/src

Значит он у меня установлен. Не понимаю… Для чего необходим buddy, что он дает, это точно вебинтерфейс?

SELECT `title`, `field`, WEIGHT() AS w 
FROM `indexnews` 
WHERE MATCH('@title \"авто\"/0.3 | @field all') 
ORDER BY `w` DESC, `time` DESC 
LIMIT 0, 20
OPTION ranker=proximity_bm25, fuzzy=1, layouts='us,ua', distance=2

Пока сервер ложится, 500 код.

Установил последнюю версию manticore.

/usr/share/manticore/modules/manticore-buddy/

Ни в одной из папки нет конфига

config.php

К примеру, как у меня настроено подключение к phpmyadmin в nginx, через ip

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	index index.php;
	charset utf-8;
	location /sql {
		alias /usr/share/phpmyadmin/;
		location ~ \.php$ {
			fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
			fastcgi_index index.php;
			fastcgi_param SCRIPT_FILENAME $request_filename;
			include fastcgi_params;
			fastcgi_ignore_client_abort off;
		}
	}
}

Возможно ли также выполнить?

Для установки, требуется docker и compressor. Которыми не пользуюсь, хотел бы самостоятельно разобраться как верно выставить зависимости к php

Вы же не на винде. Не требуется ничего для установки. Просто установите, как описано тут Install Manticore Search

Ни в одной из папки нет конфига

config.php

Что за config.php? Ничего такого не нужно.

То есть это не графические интерфейс как phpmyadmin?

$out = (new PDO('mysql:host=127.0.0.1;port=9306;'))->query(
	"SELECT *
	FROM `indexnews` 
	WHERE MATCH('авто')  
	OPTION fuzzy=1, preserve=1, layouts='us,ua,ru', distance=2"
)->fetchAll(PDO::FETCH_NUM);

print_r($out);

Просто установил последнюю версию manticore, далее создал запрос как это указано в документации. Сервер вернул 500 код

нет

Сервер вернул 500 код

Попробуйте через mysql клиент и покажите вывод.

SELECT *
FROM indexnews
WHERE MATCH('аввомобыли')
OPTION ranker=proximity_bm25, fuzzy=1, distance=2;

Работает, ок. 2 опечатки

SELECT *
FROM indexnews 
WHERE MATCH('@title "аввомобыли"/0.3')
OPTION ranker=proximity_bm25, fuzzy=1, distance=2;

Нету результата

SELECT *
FROM indexnews
WHERE MATCH('@title \"Самый быстрый серийный\"/0.3')
OPTION ranker=proximity_bm25;

Есть результат

SELECT *
FROM indexnews
WHERE MATCH('@title \"Самый быстрый серийный\"/0.3')
OPTION ranker=proximity_bm25, fuzzy=1, distance=2;

Нет результата, опечатки не делал… Добавили: , fuzzy=1, distance=2

Пытаюсь выполнить так:

  • Находим все записи, схожет заголовка более 30%
  • proximity_bm25: делаем результат на приоритет близости искомых слов(если верно)
  • Допускаем по 2 опечатки на слово
index indexnews {
  type   = plain
  source = sourcename
  path   = /var/lib/manticore/indexnews
  morphology = lemmatize_ru,lemmatize_en,lemmatize_de
  min_word_len  = 3 #Минимальная длина для индексации
  min_infix_len = 2 #Количество для опечатки при поиске, для каждого слова
  # wordforms = /etc/manticoresearch/wordforms/indexname.wfs
}

Не повторяется на версии 14.1.0. Примеры ниже. Нужно больше деталей. В идеале - подобный “скрипт”, который демонстрирует проблему, начиная с create table

mysql> drop table if exists indexnews; create table indexnews(title text) min_infix_len='2'; insert into indexnews(title) values('автомобили'),('самый быстрый серийный'); SELECT * FROM indexnews WHERE MATCH('аввомобыли') OPTION ranker=proximity_bm25, fuzzy=1, distance=2; SELECT * FROM indexnews WHERE MATCH('@title "аввомобыли"/0.3') OPTION ranker=proximity_bm25, fuzzy=1, distance=2; SELECT * FROM indexnews WHERE MATCH('@title \"Самый быстрый серийный\"/0.3') OPTION ranker=proximity_bm25; SELECT * FROM indexnews WHERE MATCH('@title \"Самый быстрый серийный\"/0.3') OPTION ranker=proximity_bm25, fuzzy=1, distance=2;
--------------
drop table if exists indexnews
--------------

Query OK, 0 rows affected (0.001 sec)

--------------
create table indexnews(title text) min_infix_len='2'
--------------

Query OK, 0 rows affected (0.001 sec)

--------------
insert into indexnews(title) values('автомобили'),('самый быстрый серийный')
--------------

Query OK, 2 rows affected (0.000 sec)

--------------
SELECT * FROM indexnews WHERE MATCH('аввомобыли') OPTION ranker=proximity_bm25, fuzzy=1, distance=2
--------------

+---------------------+----------------------+
| id                  | title                |
+---------------------+----------------------+
| 2309301764899209233 | автомобили           |
+---------------------+----------------------+
1 row in set (0.002 sec)

--------------
SELECT * FROM indexnews WHERE MATCH('@title "аввомобыли"/0.3') OPTION ranker=proximity_bm25, fuzzy=1, distance=2
--------------

+---------------------+----------------------+
| id                  | title                |
+---------------------+----------------------+
| 2309301764899209233 | автомобили           |
+---------------------+----------------------+
1 row in set (0.001 sec)

--------------
SELECT * FROM indexnews WHERE MATCH('@title \"Самый быстрый серийный\"/0.3') OPTION ranker=proximity_bm25
--------------

+---------------------+--------------------------------------------+
| id                  | title                                      |
+---------------------+--------------------------------------------+
| 2309301764899209234 | самый быстрый серийный                     |
+---------------------+--------------------------------------------+
1 row in set (0.000 sec)
--- 1 out of 1 results in 0ms ---

--------------
SELECT * FROM indexnews WHERE MATCH('@title \"Самый быстрый серийный\"/0.3') OPTION ranker=proximity_bm25, fuzzy=1, distance=2
--------------

+---------------------+--------------------------------------------+
| id                  | title                                      |
+---------------------+--------------------------------------------+
| 2309301764899209234 | самый быстрый серийный                     |
+---------------------+--------------------------------------------+
1 row in set (0.002 sec)