全文搜索无法正常工作
(persnom,nom)字段中,我拥有pers table并应用了全文索引。 以下是该表中的数据。
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操作符获取这两个记录?
全文搜索有几个设置,一个是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 OS中,可以通过更新my.cnf
文件来更改ft_min_word_len
的值。文件的位置通常在
/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