提问人:Bepe 提问时间:10/1/2021 更新时间:10/9/2021 访问量:135
PHP: MATCH AGAINST 不适用于某些停用词,但适用于其他停用词(没有明显的逻辑)
PHP: MATCH AGAINST does not work for certain stopwords but works for others (with no obvious logic to it)
问:
我正在我的计算机上使用 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 文档中列出的其他几个非索引字。
在这一点上,我无法看到此查询行为的任何逻辑,我希望有人可以指出我可能遗漏的内容。谢谢。
答:
由于“what”这个词对你有用,这是InnoDB和MyISAM的停用词,这个问题似乎与停用词无关(或者至少在你禁用停用词列表之后没有)。
最可能的原因是短词没有被索引。检查您的设置是否ft_min_word_len
,该设置默认为最小字长为 4(对于 MyISAM),因此将排除例如 但不是,符合你的情况。更改后,您必须(再次)重新创建全文索引。您可能已经在旧服务器上调整了该设置并忘记了它,因此如果该服务器仍然可用,也请在此处进行检查。for
what
或者,也许您在那里使用了 InnoDB,其中相应的设置innodb_ft_min_token_size
默认为 3,因此您的大多数测试词都可以开箱即用。此外,如果您当前正在使用 InnoDB,请在新服务器上检查该值。虽然我假设您会记得将该值明确增加到 4,但出于某种原因,它可能是您的 wamp 设置中的默认设置。
评论
IN
in_array()
ft_stopword