MySQL全文搜索查询匹配所有单词仍返回部分匹配

时间:2018-05-13 08:44:05

标签: mysql search full-text-search

我遇到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

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

1 个答案:

答案 0 :(得分:0)

嗯,我现在觉得很傻。我的表使用MyISAM,根据文档,“更多”位于停用词列表中。所以这就是搜索部分匹配的原因。谢谢大家的帮助。

修改

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