【发布时间】:2016-06-22 09:23:03
【问题描述】:
我查看了 mysql 的布尔全文搜索文档,其中写到 MATCH 将返回一个浮点值,并附有一个示例。在我发现引用此状态的其他任何地方都相同,MATCH 将按相关性分数返回一个浮点数。
但是当我运行这个查询时
select
match(j.name) against('banana* strawberr* coconut*' IN BOOLEAN MODE) as score
from juices j
order by score desc
我得到一个 0 或 1。
这是一些分数为 1 的行:
"Banana and strawberry flavor"
"Apple and banana juice"
"Coconuts with pickles"
根据我的理解,“香蕉和草莓”这行应该比其他两个得分更高,因为有两个单词匹配?
【问题讨论】:
-
如何计算相关性取决于您是否进行布尔搜索,以及使用的表引擎。
-
在这种情况下,表引擎是 MyISAM。关于布尔搜索。据我所知,默认运算符是 OR(编辑:文档指出,当既不分配 + 也不分配 - 时,单词是可选的)
-
您的查询实际上并没有过滤任何不匹配的行。
WHERE MATCH(... ) AGAINST (... IN BOOLEAN MODE)会排除这个有点神奇的两用表达式计算为 0(假)的行。唯一可能的布尔结果是 1。 -
@Michael-sqlbot 我知道,但这不是问题的一部分。问题是,为什么(在我上面的例子中)第 1、2 和 3 行的结果总是“1”。我希望第 2 行和第 3 行的值低于第 1 行,但高于 0。布尔模式不声明返回布尔值。在文档中,布尔模式启用了诸如“+ - ~”之类的反对术语的运算符,并且匹配函数实际上返回了分数。结果应该是浮点数
-
嗯......你是对的,它确实仍然是一个浮点数......至少在 MySQL 5.6 上。全文对于小型数据集的行为不太正常,但是……如果这些是表中仅有的三行,请添加更多行,看看结果是否变得更像您的预期。
标签: mysql match match-against