全文搜索无法正常工作

(persnom,nom)字段中,我拥有pers table并应用了全文索引。 以下是该表中的数据。

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

现在,我尝试使用MATCHAGAINST获取上述记录。 以下是我的查询。

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 testtest 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

链接地址: http://www.djcxy.com/p/75269.html

上一篇: Fulltext search not working properly

下一篇: Highlight matched words MySQL FULLTEXT index