相关性打分用于衡量表中某一行数据与查询文本之间的相关程度。 当执行包含全文检索条件的查询(例如 MATCH_ANY、MATCH_ALL 等)时,SelectDB 会为每一行返回一个数值型的打分结果,表示该行与查询条件的匹配强度。 该打分值可用于结果排序,以便优先返回与查询最相关的内容。
当前 SelectDB 使用 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:算法调节参数
默认参数:
|
参数 |
默认值 |
说明 |
|
|
1.2 |
控制词频对得分的影响程度 |
|
|
0.75 |
控制记录长度归一化的强度 |
|
|
1.0 |
查询级别的权重因子 |
辅助统计量:
IDF = log(1 + (N - n + 0.5) / (n + 0.5))
avgdl = total_terms / total_rows
其中:
-
N表示表中总行数; -
n表示包含该查询词的行数。
最终的总得分为所有查询词的单词得分之和。
在 SelectDB 中使用打分
支持的索引类型
-
分词型倒排索引:支持 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。