【问题标题】:Why does MATCH return integer relevance instead of float为什么 MATCH 返回整数相关性而不是浮点数
【发布时间】: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


【解决方案1】:

我刚刚在我的一张桌子上遇到了这种情况,另一张桌子提供了预期的结果。检查以验证您的表未设置为 MyISAM(仅在匹配时返回 1),您希望 InnoDB 在匹配时获得一个浮点值,以便您可以按匹配的排名进行排序。

【讨论】:

  • 谢谢,这在文档中从未声明过:/
  • 我知道已经很晚了,希望它仍然会有所帮助。
猜你喜欢
  • 2022-06-15
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2014-09-27
  • 2012-01-02
  • 2013-05-30
  • 2011-04-16
相关资源
最近更新 更多