我有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 运算符来获取这两个记录?
答案 0 :(得分:0)
全文搜索设置很少,一个是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