首页 文章

全文搜索无法正常工作

提问于
浏览
0

我有pers表并在(prenom,nom)字段上应用了组合全文索引 . 以下是该表中的数据 .

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 运算符获取两个记录?

1 回答

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

相关问题