【问题标题】:MySQL 5.6 Full Text Search Issue when Searching for the word "the" in PHP在 PHP 中搜索单词“the”时出现 MySQL 5.6 全文搜索问题
【发布时间】:2016-01-29 23:26:28
【问题描述】:

当我的搜索在全文搜索中包含“the”一词时,我遇到了问题。

这是我有问题的搜索代码:

SELECT * FROM names WHERE MATCH(myname) AGAINST ('+the' IN BOOLEAN MODE)

这个很好用:

SELECT * FROM names WHERE MATCH(myname) AGAINST ('+and' IN BOOLEAN MODE)

我已经关闭了 CNF 文件中的停用词,将最小字母更改为 3,同时使用 ft_min_word_len=3innodb_ft_min_token_size=3

我正在使用 innodb。并返回 27000 个结果,'the' 从大约 500,000 条记录的数据库中返回 17000 个,所以我没有达到 50% 的标记,即便如此,我使用的是布尔模式。我找不到另一个词来打破这一点。有什么想法吗?

【问题讨论】:

    标签: mysql full-text-search innodb


    【解决方案1】:

    建立一个不同的停用词列表。去掉其中的“the”和“and”。

    【讨论】:

    • 感谢您的回复。我已经在 my.cnf 中有 ft_stopword_file = "" 并重新启动了服务器。我已经设置好几个月了,并确认它设置正确。正如我在帖子中所说,“和”这个词很有效,我只是对“那个”这个词感到困惑......
    【解决方案2】:

    好吧,我终于想通了。看起来我已经清除了 myisam 停用词,但没有清除 innodb 停用词。这比 myisam 稍微难一些,但以下是其他可能需要它的人的步骤:

    在您的 /etc/my.cnf(或 windows 上的 my.ini)中添加以下行:

    创建一个停用词表。我在一个名为settings 的数据库和一个名为innodb-stopwords 的表中创建了我的。你不能只设置innodb_ft_enable_stopword = 0,你必须创建并链接到一个表。

    确保您的表是 innodb 并添加一个名为 value、varchar(?)、utf8_general_ci 的列。您可以将其留空或向表中添加值。

    innodb_ft_enable_stopword = 1  
    innodb_ft_server_stopword_table = settings/innodb-stopwords
    

    重启你的mysql服务器。

    删除并重新创建全文索引。

    如果不想重启服务器,可以用动态设置变量(同时更新cnf/ini文件,以便下次服务器重启)

    --innodb_ft_enable_stopword=1
    --innodb_ft_server_stopword_table=db_name/table_name
    

    我没有看到任何重新创建索引的解决方法...不过,您可以在一个命令中执行此操作,因此该表一直被锁定并且您的用户不会收到错误:

    ALTER TABLE `tablename` DROP INDEX indexname, ADD FULLTEXT(`columnname`);
    

    【讨论】:

    • (接受你自己的答案是可以的。)
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多