5

如果我运行此查询并打印每行的分数,它们始终为 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

4 回答 4

4

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

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

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,非布尔模式返回十进制结果,但只能应用于索引列...另见此处

于 2011-07-03T10:58:27.650 回答
2

使用NATURAL MODEas score 的结果:

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为第一个条目添加了更多,因为它是直接命中和/或直接跟随的词返回更好的搜索结果。

于 2015-04-11T23:51:50.493 回答
2

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

于 2017-03-15T21:27:01.467 回答
0

分数可能始终为1(或0)的另一个原因是全文索引是否发生了许多变化:运行OPTIMIZE TABLE my_table将修复此类退化的索引,如微调全文搜索页面中所述。

于 2020-10-13T23:02:31.940 回答