跳到主要内容

相关性打分

在执行全文检索类查询(如 MATCH_ANYMATCH_ALLMATCH_PHRASE 等)时,往往需要按"匹配程度"对结果进行排序,从而优先返回最相关的记录。Doris 提供了 相关性打分(Relevance Scoring) 能力:每一行都会根据查询条件计算一个数值化的得分,分数越高表示相关性越强。

当前 Doris 使用 BM25(Best Matching 25) 算法作为相关性打分的默认实现。

典型使用场景:

  • 搜索引擎类应用:根据关键词返回最相关的文档列表
  • 日志分析:按相关性排序,快速定位与关键词最匹配的日志
  • 内容推荐:基于文本相似度筛选优先内容
  • 知识库检索:按问题相关度返回候选答案

快速上手

以下示例展示了如何在查询中启用相关性打分并按得分排序:

SELECT *,
score() AS relevance
FROM search_demo
WHERE content MATCH_ANY 'text search test'
ORDER BY relevance DESC
LIMIT 10;

执行后,Doris 会基于 BM25 算法计算每一行的得分,并返回前 10 条最相关的记录:

+------+-----------------------------------+---------+--------------+-----------+
| id | content | author | publish_date | relevance |
+------+-----------------------------------+---------+--------------+-----------+
| 1 | Full text search engine test demo | Alice | 2024-01-01 | 2.915228 |
| 7 | Text processing techniques | Grace | 2024-01-07 | 1.341931 |
| 5 | Performance test framework | Eve | 2024-01-05 | 1.341931 |
| 3 | Advanced search algorithms | Charlie | 2024-01-03 | 1.341931 |
+------+-----------------------------------+---------+--------------+-----------+

启用条件

要使打分计算生效,查询需同时满足以下三个条件:

  1. SELECT 子句中显式调用 score() 函数
  2. WHERE 子句中至少包含一个 MATCH_* 条件
  3. 查询为 Top-N 类型,且 ORDER BY 基于 score() 结果排序

支持的索引类型

索引类型是否支持打分说明
分词型倒排索引支持可计算 BM25 相关性得分
非分词型倒排索引不支持仅支持精确匹配,不计算打分

支持的查询类型

  • MATCH_ANY
  • MATCH_ALL
  • MATCH_PHRASE
  • MATCH_PHRASE_PREFIX
  • SEARCH

BM25 算法说明

BM25 是一种基于概率模型的文本相关性算法。它综合考虑 词频(TF)逆文档频率(IDF)记录长度 三个因子,对匹配结果进行加权计算。相比传统 TF-IDF 模型,BM25 具有更好的鲁棒性与可调性,能够有效平衡长文本与短文本之间的得分差异。

核心公式

score = IDF × (tf × (k1 + 1)) / (tf + k1 × (1 - b + b × |d| / avgdl))

公式中各变量的含义:

变量含义
tf查询词在当前行中的出现次数
IDF逆文档频率,衡量词的稀有程度
|d|当前行的长度(分词后的词元数)
avgdl表中所有行的平均长度
k1b算法调节参数

参数说明

参数默认值说明
k11.2控制词频对得分的影响程度
b0.75控制记录长度归一化的强度
boost1.0查询级别的权重因子

辅助统计量

IDF   = log(1 + (N - n + 0.5) / (n + 0.5))
avgdl = total_terms / total_rows

其中:

  • N:表中总行数
  • n:包含该查询词的行数

当查询包含多个词项时,最终得分为各词项得分之和

结果解读

理解打分结果有助于更准确地使用相关性排序:

特征说明
得分范围正数,无固定上限;通常仅比较相对大小,不关注绝对数值
多词查询包含多个词项时,总得分等于各词项得分之和
长度影响在包含相同词项的前提下,较短的记录得分略高
无匹配词项若查询词未在表中出现,对应得分为 0

常见问题

Q1:为什么我的查询没有返回打分?

请依次确认:

  1. SELECT 中是否调用了 score() 函数
  2. WHERE 中是否包含 MATCH_* 条件
  3. ORDER BY 是否基于 score() 排序
  4. 索引是否为分词型倒排索引

Q2:BM25 与 TF-IDF 有什么区别?

BM25 在 TF-IDF 的基础上引入了 词频饱和长度归一化 两个改进,使长短文本间的得分更加均衡,鲁棒性更好。

Q3:得分可以跨查询比较吗?

不建议。BM25 得分依赖具体查询词及表中数据的分布,不同查询之间的绝对值不具备可比性,仅在同一查询的结果集内比较相对大小