ES,TF/IDF排序算法

script score中除了doc/_score还可以通过_index获取一些查询中的参数,其中词频、文档数什么的就是通过_index.xxx获取

def termInfo = _index['name'].get('北京', _POSITIONS| _OFFSETS |_PAYLOADS|_CACHE ); 
def score = 0; 
def tf = 0;
for (pos in termInfo) {
 //词频,词出现的次数 
 tf = tf + 1;
 //词出现的位置(是词的位置,比如name是“上海北京”,则有可能是1)
 pos.startOffset;
}
return score;

TF/IDF

TF = sqrt(词出现的次数)

IDF = 1+log(总文档数/(包含该词的文档数+1))

fieldNorm 看起来像是 1/ sqrt(该文档总共包含的所有词数)

最终得分是TF * IDF

如果考虑到fieldNorm的话,大概是TF * (IDF * fieldNorm)

这个大概的作用就是如果把内容短的得分提高,可以在建索引的时候把它关掉,我是觉的这个一般情况下没什么用

"properties": {
    "text": {
        "type": "string",
        "norms": { "enabled": false } 
    }
}

参考:

https://www.elastic.co/guide/en/elasticsearch/reference/2.4/modules-advanced-scripting.html

https://www.elastic.co/guide/en/elasticsearch/guide/2.x/scoring-theory.html#tfidf

https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-fields.html

发表回复

您的电子邮箱地址不会被公开。