FieldMatchWeighted

简介

计算查询词在指定字段上的匹配度。字段上命中的查询词越多,权重越高,匹配分数也越高。FieldMatchWeighted的分数由两部分组成,baseScore和bonusScore,计算公式可以简单表示为:(A*baseScore + bonusScore) / (A + 1)。通过A来调节baseScore所占的比重。baseScore的计算逻辑可以表示为1。tw表示term的权重,由查询分析产出,默认为1。bonusScore为加权分数,只有当查询词和字段精确匹配、查询词是字段的一个片段时才进行加权。可以通过FieldMatchWeighted提供的接口函数对paramA与加权分数进行调整。

函数列表

函数原型

函数简介

FieldMatchWeighted create(OpsScorerInitParams params, CString indexName, CString fieldName)

创建FieldMatchWeighted对象

void setGroupScoreMergeOp(CString opName)

设置多个query group结果的merge方式,可以是sum和max,默认为sum

void setParamA(double paramA)

设置参数A

void setExactMatchBonus(double exactMatchBonus)

设置exact match bonus

void setNgramMatchBonus(double ngramMatchBonus)

设置ngram match bonus

double evaluate(OpsScoreParams params)

计算查询词在指定字段上的匹配度

函数详情

FieldMatchWeighted create(OpsScorerInitParams params, CString indexName, CString fieldName)

创建FieldMatchWeighted对象,需要指定待匹配的索引名称和字段名称。参数列表:params — 初始化输入参数,详情请参考OpsScorerInitParams手册。indexName — 指定的索引名,必须为常量。fieldName — 索引下的字段名,该字段需要为TEXT或者SHORT_TEXT,并且分词类型为中文基础分词、自定义分词、单字分词、英文分词、模糊分词,必须是常量。

void setGroupScoreMergeOp(CString opName)

设置多个查询分组之间分数组合规则,目前仅支持max、sum,如果没有设置默认多个group分数进行sum。该函数必须在算分插件初始化阶段调用。查询分组是指经过查询分析处理之后对原始查询词进行的扩展,默认只有一个查询分组。参数列表:opName — 多个查询分组分数组合规则,目前支持max与sum。

void setParamA(double paramA)

设置参数A的值,该参数用于控制baseScore在整体分数中的权重。该函数必须在算分插件初始化阶段调用。参数列表:paramA — A的值,默认为0.5。

void setExactMatchBonus(double exactMatchBonus)

设置查询词与字段精确匹配时的加权分数,精确匹配表示查询词语字段内容完全相同。该函数必须在算分插件初始化阶段调用。参数列表:exactMatchBonus — 加权分数,默认为1.0。

void setNgramMatchBonus(double ngramMatchBonus)

设置查询词是字段的一个片段时的加权分数,该函数必须在算分插件初始化阶段调用。参数列表:ngramMatchBonus — 加权分数,默认为0.6。

double evaluate(OpsScoreParams params)

计算查询词在指定索引的指定字段上的匹配分数。参数列表:params — 算分输入参数,详情请参考OpsScoreParams手册。返回值:返回查询词在字段上的文本相关性,取值范围为[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.FieldMatchWeighted;

class BasicSimilarityScorer {
    FieldMatchWeighted _f1;
    boolean init(OpsScorerInitParams params) {
        _f1 = FieldMatchWeighted.create(params, "title_index", "title");
        _f1.setGroupScoreMergeOp("max");
        _f1.setParamA(1);
        _f1.setExactMatchBonus(0.5);
        _f1.setNgramMatchBonus(0.3);
        return true;
    }

    double score(OpsScoreParams params) {
        return _f1.evaluate(params);
    }
}