MySQL:为什么得分总是1全文?

时间:2011-07-03 10:52:49

标签: mysql full-text-search relevance

如果我运行此查询并打印每行的分数,则它们始终为1:

以下是一些示例查询结果:

First     |  Last     | Score
------------------------------
Jonathan  |  Bush     | 1
Joshua    |  Gilbert  | 1
Jon       |  Jonas    | 1

这是我运行的查询:

SELECT First, Last, MATCH(First, Last) AGAINST ('Jon' IN BOOLEAN MODE) AS score 
FROM users 
WHERE MATCH(First, Last) AGAINST('Jon' IN BOOLEAN MODE)
ORDER BY score DESC;

4 个答案:

答案 0 :(得分:5)

BOOLEAN MODE仅支持二进制答案,表示搜索字符串是否出现在列中,表示0或1。要获得十进制结果来计算权重,您必须在索引列上使用匹配。

您可以通过这种方式使用布尔模式来获取您的英雄:

SELECT *, ((1.3 * (MATCH(column1) AGAINST ('query' IN BOOLEAN MODE))) +
(0.6 * (MATCH(column2) AGAINST ('query' IN BOOLEAN MODE)))) AS relevance
FROM table WHERE ( MATCH(column1,column2) AGAINST
('query' IN BOOLEAN MODE) ) ORDER BY relevance DESC

布尔模式的优点是你可以在非索引列上使用它,但结果只有0,1,非布尔模式返回小数结果,但只能应用于索引列...还here

答案 1 :(得分:2)

使用NATURAL MODE的结果作为分数:

SELECT First, Last, MATCH(First, Last) AGAINST ('Jon') AS score 
FROM users 
WHERE MATCH(First, Last) AGAINST('+Jon' IN BOOLEAN MODE)
ORDER BY score DESC;

注意:注意+运算符。这个仅适用于BOOLEAN MODE

为什么我建议NATURAL MODE按相关性排序,它会返回Jon Chris

Jon Chris        | Jonas
Jon Martin Chris | Jonas

BOOLEAN MODE 可以返回+Jon +Chris

Jon Martin Chris | Jonas
Jon Chris        | Jonas

这是因为BOOLEAN MODE中的两个单词都会返回得分2,但NATURAL MODE会为第一个条目添加更多内容,因为它会直接命中和/或直接跟随单词返回更好的搜索结果。

答案 2 :(得分:0)

接受的答案部分正确。根据MySQL文档,MATCH AGAINST可以返回浮点数。如果是MyISAM,数据库引擎只会在匹配时返回1。使用MATCH AGAINST进行InnoDB全文搜索将返回浮点数,以便匹配结果可以排序更高质量的匹配。

答案 3 :(得分:0)

分数可能始终为1(或0)的另一个原因是,如果全文索引发生了许多变化:运行OPTIMIZE TABLE my_table将解决此类降级的索引,如Fine-tuning Full-text Search页。