【问题标题】:Fulltext search not working properly全文搜索无法正常工作
【发布时间】:2014-12-05 11:18:35
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 你早期的ft_min_word_len是什么,你改完后重启mysql了吗?同样在更改后,您需要删除索引并重新创建它。或者需要修表。还要注意mysql全文搜索有停用词列表dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html
    • 我使用的是 Windows,所以我签入了 my.ini。 ft_min_word_len 在那里不可用。我添加它并将其分配给 2 然后重新启动 mysql 并重新索引全文索引
    • 在 Windows 中,我猜它在某处 C:\Windows\my.ini 并在添加它时确保您有 [mysqld] 如果没有,则将其添加到行上方。然后重启mysql服务器。删除索引并重新创建
    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2019-08-04
    • 2021-11-10
    • 2017-01-28
    • 2013-12-23
    • 2015-07-27
    • 2014-07-17
    相关资源
    最近更新 更多