PHP: MATCH AGAINST 不适用于某些停用词,但适用于其他停用词(没有明显的逻辑)

PHP: MATCH AGAINST does not work for certain stopwords but works for others (with no obvious logic to it)

提问人:Bepe 提问时间:10/1/2021 更新时间:10/9/2021 访问量:135

问:

我正在我的计算机上使用 WAMP 作为可搜索的数据库,该数据库利用如下所示的 MySQL 查询:

SELECT * FROM table_name WHERE MATCH (field_01, field_02, field_03, field_04, field_05, field_06, field_07, field_08, field_09) AGAINST('\"$searchterm\"' IN BOOLEAN MODE) ORDER BY field_01,field_10,field_11,field_12 ASC

我有一个包含字段 01 到 09 的完整索引,并且此设置在我以前的计算机上运行良好(WAMP 安装至少 5 年)。

但是,在我的新计算机上(使用MySQL版本5.7.31安装WAMP),它只能选择性地工作,即有时不会返回任何结果。

我已经研究了这个问题,停用词似乎是解决方案的关键,因为像“为什么”、“和”、“或”这样的搜索词会出现零结果问题。

我尝试了 ft_stopword_file=“” 方法(重新启动 WAMP 并修复表)。没有帮助。

奇怪的是,同样的查询适用于搜索词“what”和 MySQL 文档中列出的其他几个非索引字。

在这一点上,我无法看到此查询行为的任何逻辑,我希望有人可以指出我可能遗漏的内容。谢谢。

php mysql 匹配 停用词

评论

0赞 Sherif 10/2/2021
欢迎来到 StackOverflow。你到底为什么要在MySQL中这样做?
0赞 Bepe 10/2/2021
这是一个相当复杂的系统,是几年前创建的。现在我只想把它重新安置到一台新电脑上,让它在那里工作。我已经设法解决了过程中出现的大部分问题,但这个问题让我难住了。
0赞 Sherif 10/3/2021
好吧,有几个很好的理由来重构它。首先,如果你的主要问题是遗留问题,那么这就是你重构的机会。停用词列表不必被视为水平域。而不是字段,想想行。选择所有单词或匹配 as in 子句变得更加容易。如果您使用的是平面文件,则在 PHP 中会遇到同样的问题,想想之类的。INin_array()
0赞 Bepe 10/5/2021
谢谢你,谢里夫。
1赞 Rick James 10/7/2021
正在使用什么引擎?大概是 InnoDB?但暗示 MyISAM?ft_stopword

答:

1赞 Solarflare 10/9/2021 #1

由于“what”这个词对你有用,这是InnoDB和MyISAM的停用词,这个问题似乎与停用词无关(或者至少在你禁用停用词列表之后没有)。

最可能的原因是词没有被索引。检查您的设置是否ft_min_word_len,该设置默认为最小字长为 4(对于 MyISAM),因此将排除例如 但不是,符合你的情况。更改后,您必须(再次)重新创建全文索引。您可能已经在旧服务器上调整了该设置并忘记了它,因此如果该服务器仍然可用,也请在此处进行检查。forwhat

或者,也许您在那里使用了 InnoDB,其中相应的设置innodb_ft_min_token_size默认为 3,因此您的大多数测试词都可以开箱即用。此外,如果您当前正在使用 InnoDB,请在新服务器上检查该值。虽然我假设您会记得将该值明确增加到 4,但出于某种原因,它可能是您的 wamp 设置中的默认设置。