全部產品
Search
文件中心

OpenSearch:BM25

更新時間:Jul 13, 2024

簡介

計算查詢詞在指定欄位的上的BM25值,用于衡量查詢詞語欄位的相似性。BM25的計算公式可以簡單的描述如下:

1其中: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);
    }
};