繁体   English   中英

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

[英]MySQL Fulltext search query matching ALL words still returns partial matches

我遇到了与该海报相同的问题,但是被接受的答案不能解决我的问题。 基本上,我试图将我的“标题”列与全文搜索查询中的所有单词进行匹配,但仍返回部分匹配项。 最近,我将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

尽管使用了+运算符,它似乎并没有缩小我的结果。 任何帮助都将受到欢迎,在此先感谢您。

好吧,我现在觉得很傻。 我的表使用MyISAM,根据文档,“更多”位于停用词列表中。 这就是为什么该搜索在部分匹配中得到重视的原因。 谢谢大家的帮助。

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM