【问题标题】:PHP: MATCH AGAINST does not work for certain stopwords but works for others (with no obvious logic to it)PHP: MATCH AGAINST 不适用于某些停用词,但适用于其他停用词(没有明显的逻辑)
【发布时间】:2021-11-23 06:36:15
【问题描述】:

我在我的计算机上使用 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 documentation 中列出的其他几个停用词,同样的查询也适用。

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

【问题讨论】:

  • 欢迎来到 StackOverflow。为什么要在 MySQL 中执行此操作?
  • 这是几年前创建的一个相当复杂的系统。现在我只是想将它重新定位到一台新计算机并让它在那里工作。我已经设法解决了这个过程中出现的大部分问题,但这个问题让我很困惑。
  • 好吧,有几个很好的理由来重构它。如果您的主要问题是遗留问题,那么这是您重构的机会。停用词列表不需要被视为水平域。而不是字段认为行。在IN 子句中选择所有单词或匹配变得更容易。如果您使用的是平面文件,那么在 PHP 中也会出现同样的问题,请考虑 in_array() 或类似的。
  • 谢谢你,谢里夫。
  • 正在使用什么引擎?大概是 InnoDB?但是ft_stopword 暗示 MyISAM?

标签: php mysql match stop-words


【解决方案1】:

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

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

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

【讨论】:

  • 确实是这个原因。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多