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