【问题标题】:MySQL Fulltext search query matching ALL words still returns partial matches匹配所有单词的 MySQL 全文搜索查询仍然返回部分匹配
【发布时间】:2018-10-23 04:04:30
【问题描述】:

我遇到了与this poster had 相同的问题,但是接受的答案并没有解决我的问题。基本上我正在尝试将我的“标题”列与全文搜索查询中的所有单词匹配,但它仍然返回部分匹配。我最近将我的 MySQL 数据库表转移到了一个新的 Web 主机,我的全文搜索的行为不像在我的旧服务器上那样。我假设可能存在设置差异,但我似乎无法找到它。全文已启用,我的 ft_min_word_len 设置为 3,但以下 MySQL 查询仍在获得部分匹配:

SELECT title, MATCH (title) AGAINST ("more pink") AS relevance
FROM discography
WHERE MATCH (title) AGAINST ("+more +pink" IN BOOLEAN MODE)
ORDER BY relevance DESC

以上代码返回如下集合,前7个标题分别为:

Under The Pink & More Pink
Under The Pink Tour All Pass
Under The Pink Tour Guest Pass
Under The Pink Tour Aftershow Pass
Under The Pink Tour After Show Pass
Under The Pink
Under The Pink

如何省略部分匹配?有什么我想念的吗?如果我将 SELECT 语句置于布尔模式,结果会更糟,因为这会将相关性设置为二进制 1 或 0:

SELECT title, MATCH (title) AGAINST ("+more +pink" IN BOOLEAN MODE) AS relevance
FROM discography
WHERE MATCH (title) AGAINST ("+more +pink" IN BOOLEAN MODE)
ORDER BY relevance DESC

前 7 个标题是:

Under The Pink
Under The Pink
Under The Pink
Under The Pink
Under The Pink
Under The Pink
Under The Pink & More Pink

尽管使用了 + 运算符,但它似乎并没有缩小我的结果。欢迎任何帮助,非常感谢。

【问题讨论】:

  • 不一定重要,但是您可以尝试使用单引号而不是双引号,例如使用WHERE MATCH (title) AGAINST ('+more +pink' IN BOOLEAN MODE) ?
  • 感谢@TimBiegeleisen 的想法。我尝试了您的建议,但仍然获得相同的结果。
  • 我认为您应该尝试使您的问题可重现,因为您所看到的不应该发生。您确定您正确创建了全文索引吗?
  • 我投了你一票,这是我能做的最多的事,因为我看不出你的逻辑有什么明显的问题。
  • 很抱歉,无法在 mysql v5.5 或 5.7 中重现上述行为。我不知道有任何设置会改变 mysql 中 + 运算符的含义。

标签: mysql search full-text-search


【解决方案1】:

嗯,我现在觉得很傻。我的表使用 MyISAM,根据文档,“更多”在停用词列表中。因此,这就是为什么该搜索会选择部分匹配的原因。感谢大家的帮助。

编辑

如果有人对在您的网站上编写自己的搜索引擎时如何“绕过”共享主机上的停用词列表感到好奇,我建议使用一种类似的技术来绕过我的“ft_min_word_len”设置。创建一个单独的搜索列,以保存您希望通过全文搜索的列中的所有值的副本。创建一个包含文件,将所有stopwords listed for your database type 存储到一个数组中。在将值保存到专用搜索列之前,循环遍历列值中的每个单词,并使用包含文件检查停用词数组中是否存在任何单词。如果任何值包含停用词,请在最后的停用词上添加一个字符(我选择了“z”)。然后,当触发搜索时,通过相同的停用词数组循环搜索词并检查是否包含停用词。如果停用词数组中有任何搜索词,请再次将您选择添加到搜索列中的停用词末尾的相同字符添加(在本例中为“z”)。在遍历数组并对搜索词进行必要的更改后,您可以搜索您的专用搜索列,而不必担心您的停用词被忽略。当然,我的搜索栏不用于任何显示目的,仅用于搜索。

【讨论】:

    猜你喜欢
    • 2023-01-02
    • 2018-01-12
    • 1970-01-01
    • 2015-12-11
    • 2017-03-02
    • 2012-04-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多