文本检索打分
概述
文本检索打分用于衡量表中某一行数据与查询文本之间的相关程度。
当执行包含全文检索条件的查询(例如 MATCH_ANY
、MATCH_ALL
等)时,Doris 会为每一行返回一个数值型的打分结果,表示该行与查询条件的匹配强度。
该打分值可用于结果排序,以便优先返回与查询最相关的内容。
当前 Doris 使用 BM25(Best Matching 25) 算法进行文本相关性计算。
BM25 算法简介
BM25 是一种基于概率模型的文本相关性算法。 它通过综合考虑词频、逆文档频率以及记录长度,对匹配结果进行加权计算。 BM25 相比传统 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
表示包含该查询词的行数。
最终的总得分为所有查询词的单词得分之和。
在 Doris 中使用打分
支持的索引类型
- 分词型倒排索引:支持 BM25 打分计算。
- 非分词型倒排索引:仅支持精确匹配,不计算打分。
支持的查询类型
MATCH_ANY
MATCH_ALL
MATCH_PHRASE
MATCH_PHRASE_PREFIX
SEARCH
查询下推规则
为启用打分计算,下推条件需满足:
- 查询语句的
SELECT
中包含score()
函数; WHERE
子句中包含至少一个MATCH_*
条件;- 查询为 Top-N 类型,且
ORDER BY
子句基于score
结果排序。
示例
SELECT *,
score() AS relevance
FROM search_demo
WHERE content MATCH_ANY '检索测试'
ORDER BY relevance DESC
LIMIT 10;
该语句会根据 BM25 打分结果返回前 10 条最相关的记录。
结果说明
- 得分范围:BM25 得分为正数,无固定上限。通常仅比较相对大小。
- 多词查询:若查询包含多个词项,总得分为各词项得分之和。
- 长度影响:较短记录在包含相同词项时得分略高。
- 无匹配词项:若查询词未出现在表中,对应得分为 0。