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 年历史)。

然而,在我的新电脑上(WAMP 安装 MySQL 版本 5.7.31)它只能选择性地工作,即有时 returns 没有结果。

我研究了这个问题,停用词似乎是解决方案的关键,因为 'why'、'for'、'and'、[= 等搜索词会出现零结果问题30=].

我试过 ft_stopword_file="" 方法(重启 WAMP 并修复 table)。没有帮助。

奇怪的是,同一个查询对搜索词 'what' 和 MySQL documentation.

中列出的其他几个停用词有效

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

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

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

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