简介
计算查询词在指定字段的上的BM25值,用于衡量查询词语字段的相似度。BM25的计算公式可以简单的描述如下:
其中:tf(i) 表示term在所求字段上出现的次数
idf(i) 表示term的逆向文件频率 (inverse document frequency, IDF)
f(ngram) = ngram > 1 ? ngram*C : 1
K: 控制term frequency 影响的参数因子
C: 控制检索单元权重的参数B: 控制field length影响的参数BM25提供了多个函数,方便用户控制计算公式中的各个参数,方便用户对BM25进行定制。
函数列表
函数原型 | 函数简介 |
BM25 create(OpsScorerInitParams params, CString indexName, CString fieldName) | 构造BM25对象 |
void setGroupScoreMergeOp(CString opName) | 设置多个query group结果的merge方式,可以是sum和max,默认为sum |
void setParamK(double paramK) | 设置参数K的值 |
void setParamB(double paramB) | 设置参数B的值 |
void setParamC(double paramC) | 设置参数C的值 |
void setFieldAvgLength(double avgFieldLength) | 设置平均字段长度 |
double evaluate(OpsScoreParams params) | 计算查询词分词词组在字段上分布的紧密程度 |
函数详情
BM25 create(OpsScorerInitParams params, CString indexName, CString fieldName)
创建BM25对象,需要指定待匹配的索引名称和字段名称。参数列表:params — 初始化输入参数,详情请参考OpsScorerInitParams手册。indexName — 指定的索引名,必须为常量。fieldName — 索引下的字段名,该字段需要为TEXT或者SHORT_TEXT,并且分词类型为中文基础分词、自定义分词、单字分词、英文分词、模糊分词,必须是常量。
void setGroupScoreMergeOp(CString opName)
设置多个查询分组之间分数组合规则,目前仅支持max、sum,如果没有设置默认多个group分数进行sum。该函数必须在算分插件初始化阶段调用。查询分组是指经过查询分析处理之后对原始查询词进行的扩展,默认只有一个查询分组。参数列表:opName — 多个查询分组分数组合规则,目前支持max与sum。
void setParamK(double paramK)
设置参数K的值,该函数必须在算分插件初始化阶段调用。参数列表:paramK — K的值,默认为2.0。
void setParamB(double paramB)
设置参数B的值,该函数必须在算分插件初始化阶段调用。参数列表:paramB — B的值,默认为0.1。
void setParamC(double paramC)
设置参数C的值,该函数必须在算分插件初始化阶段调用。参数列表:paramC — C的值,默认为0.7。
void setFieldAvgLength(double avgFieldLength)
设置平均字段长度,该函数必须在算分插件初始化阶段调用。参数列表:avgFieldLength — 平均字段长度,默认为20。
double evaluate(OpsScoreParams params)
计算查询词在指定索引的指定字段上的BM25分数。参数列表:params — 算分输入参数,详情请参考OpsScoreParams手册。返回值:返回查询词在字段上的BM25分数,取值范围为[0, 1]。代码示例:
package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.features.similarity.fieldmatch.BM25;
class BasicSimilarityScorer {
BM25 _f1;
boolean init(OpsScorerInitParams params) {
_f1 = BM25.create(params, "text_index", "text");
_f1.setParamK(3);
_f1.setParamB(0.5);
_f1.setParamC(1.2);
_f1.setFieldAvgLength(30);
return true;
}
double score(OpsScoreParams params) {
return _f1.evaluate(params);
}
};