全文搜索无法正常工作

时间:2014-12-05 11:18:36

标签: mysql sql full-text-search full-text-indexing

我有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 个答案:

答案 0 :(得分:0)

全文搜索设置很少,一个是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操作系统中,您可以通过更新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