Полнотекстовый поиск не работает должным образом

У меня есть таблица таблиц и применяется объединить полнотекстовый индекс на (prenom, nom) полей. Ниже приведены данные в этой таблице.

 persID prenom      nom (pers table)
--------------------------------
 116    te          te
 117    te test     test te

Теперь я попытался получить вышеуказанную запись, используя MATCH и AGAINST. Ниже мой запрос.

SELECT `Pers`.`persID`, Pers.prenom, Pers.nom
FROM `bdrplus`.`pers` AS `Pers`
LEFT JOIN `bdrplus`.`pers_detail` AS `PersDetail` 
     ON ( `PersDetail`.`persID` = `Pers`.`persID` )
WHERE `Pers`.`etat` =1
AND `Pers`.`persID` !=55
AND MATCH(`Pers`.`prenom`, `Pers`.`nom`) AGAINST('te*' IN BOOLEAN MODE)

Result
------------------------
persID   prenom      nom     
117      te test     test te

Теперь я попытался использовать mysql LIKE (%..%) оператор. Ниже приведен запрос, который я пробовал.

SELECT `Pers`.`persID`
FROM `bdrplus`.`pers` AS `Pers`
LEFT JOIN `bdrplus`.`pers_detail` AS `PersDetail` 
     ON ( `PersDetail`.`persID` = `Pers`.`persID` )
WHERE `Pers`.`etat` =1
AND `Pers`.`persID` !=55
AND (Pers.prenom LIKE 'te%' OR Pers.nom LIKE 'te%')

Result
-----------------------
 persID prenom      nom (pers table)
 116    te          te
 117    te test     test te

Я не понимаю, почему я не получаю обе записи, используя оператор MATCH AGAINST в запросе полнотекстового индекса?

1 ответ

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

В вашем случае это верный результат, так как у вас есть

MATCH(Pers.prenom, Pers.nom) AGAINST('te*' IN BOOLEAN MODE)

и его соответствие te test а также test te

Вы можете проверить ft_mn_word_len, используя следующую команду

show variables like 'ft_%';

Если вам нужно установить его меньше значения по умолчанию и разрешить учитывать длину слова 2, вам нужно изменить это значение.

В ОС Debian / Ubuntu вы можете изменить значение ft_min_word_len обновив my.cnf файл Расположение файла обычно находится под

/etc/mysql

Перейдите в указанную выше папку и введите

sudo vi my.cnf

Затем в файле проверьте блок [mysqld] и посмотреть, если переменная уже существует, если нет, просто добавьте строку

ft_min_word_len = 2

Сохраните его и перезапустите MySQL

sudo /etc/init.d/mysql restart

или же

sudo service mysql restart

Если у вас уже были полнотекстовые индексы в таблице до выполнения вышеупомянутой операции, после вышеупомянутых изменений удалите индексы и перестроите, или вы можете сделать восстановление таблицы из терминала mysql что-то как

repair table table_name quick

Другие вопросы по тегам