我有pers表并在(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 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