相关性打分
在执行全文检索类查询(如 MATCH_ANY、MATCH_ALL、MATCH_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 |
+------+-----------------------------------+---------+--------------+-----------+
启用条件
要使打分计算生效,查询需同时满足以下三个条件:
SELECT子句中显式调用score()函数WHERE子句中至少包含一个MATCH_*条件- 查询为 Top-N 类型,且
ORDER BY基于score()结果排序
支持的索引类型
| 索引类型 | 是否支持打分 | 说明 |
|---|---|---|
| 分词型倒排索引 | 支持 | 可计算 BM25 相关性得分 |
| 非分词型倒排索引 | 不支持 | 仅支持精确匹配,不计算打分 |
支持的查询类型
MATCH_ANYMATCH_ALLMATCH_PHRASEMATCH_PHRASE_PREFIXSEARCH
BM25 算法说明
BM25 是一种基于概率模型的文本相关性算法。它综合考虑 词频(TF)、逆文档频率(IDF) 与 记录长度 三个因子,对匹配结果进行加权计算。相比传统 TF-IDF 模型,BM25 具有更好的鲁棒性与可调性,能够有效平衡长文本与短文本之间的得分差异。
核心公式
score = IDF × (tf × (k1 + 1)) / (tf + k1 × (1 - b + b × |d| / avgdl))
公式中各变量的含义:
| 变量 | 含义 |
|---|---|
tf | 查询词在当前行中的出现次数 |
IDF | 逆文档频率,衡量词的稀有程度 |
|d| | 当前行的长度(分词后的词元数) |
avgdl | 表中所有行的平均长度 |
k1、b | 算法调节参数 |
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
k1 | 1.2 | 控制词频对得分的影响程度 |
b | 0.75 | 控制记录长度归一化的强度 |
boost | 1.0 | 查询级别的权重因子 |
辅助统计量
IDF = log(1 + (N - n + 0.5) / (n + 0.5))
avgdl = total_terms / total_rows
其中:
N:表中总行数n:包含该查询词的行数
当查询包含多个词项时,最终得分为各词项得分之和。
结果解读
理解打分结果有助于更准确地使用相关性排序:
| 特征 | 说明 |
|---|---|
| 得分范围 | 正数,无固定上限;通常仅比较相对大小,不关注绝对数值 |
| 多词查询 | 包含多个词项时,总得分等于各词项得分之和 |
| 长度影响 | 在包含相同词项的前提下,较短的记录得分略高 |
| 无匹配词项 | 若查询词未在表中出现,对应得分为 0 |
常见问题
Q1:为什么我的查询没有返回打分?
请依次确认:
SELECT中是否调用了score()函数WHERE中是否包含MATCH_*条件ORDER BY是否基于score()排序- 索引是否为分词型倒排索引
Q2:BM25 与 TF-IDF 有什么区别?
BM25 在 TF-IDF 的基础上引入了 词频饱和 与 长度归一化 两个改进,使长短文本间的得分更加均衡,鲁棒性更好。
Q3:得分可以跨查询比较吗?
不建议。BM25 得分依赖具体查询词及表中数据的分布,不同查询之间的绝对值不具备可比性,仅在同一查询的结果集内比较相对大小。