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

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

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

Теперь я попытался получить вышеуказанную запись, используя ПОИСКПОЗ и ПРОТИВ. Ниже мой запрос.

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 в запросе полнотекстового индекса?


person Jimit    schedule 05.12.2014    source источник


Ответы (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

or

sudo service mysql restart

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

repair table table_name quick

person Abhik Chakraborty    schedule 05.12.2014
comment
Каким было ваше раннее ft_min_word_len, перезапускали ли вы mysql после изменений? Также после изменения вам нужно удалить индекс и создать его заново. Или нужно отремонтировать стол. Также обратите внимание, что полнотекстовый поиск mysql имеет список стоп-слов dev.mysql .com/doc/refman/5.1/en/fulltext-stopwords.html - person Abhik Chakraborty; 05.12.2014
comment
Я использую окна, поэтому я проверил my.ini. ft_min_word_len там недоступен. Я добавил его и присвоил ему 2, затем перезапустил mysql и переиндексировал полнотекстовый индекс. - person Jimit; 05.12.2014
comment
В окнах я предполагаю, что это где-то C:\Windows\my.ini, и при добавлении убедитесь, что у вас есть [mysqld], если нет, добавьте это над строкой. Затем перезапустите сервер mysql. Удалите индексы и создайте заново - person Abhik Chakraborty; 05.12.2014