Полнотекстовый поиск не работает должным образом
У меня есть таблица таблиц и применяется объединить полнотекстовый индекс на (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