跳到主要内容

文本检索打分

概述

文本检索打分用于衡量表中某一行数据与查询文本之间的相关程度。 当执行包含全文检索条件的查询(例如 MATCH_ANYMATCH_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:算法调节参数

默认参数:

参数默认值说明
k11.2控制词频对得分的影响程度
b0.75控制记录长度归一化的强度
boost1.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

查询下推规则

为启用打分计算,下推条件需满足:

  1. 查询语句的 SELECT 中包含 score() 函数;
  2. WHERE 子句中包含至少一个 MATCH_* 条件;
  3. 查询为 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。