沙师弟,师父的充电器掉了

TF/IDF 计算fieldNorm,不同文档字段的词数(fieldNum)不一样,为什么得分结果都一样(版本2.3)

Elasticsearch | 作者 walter123 | 发布于2018年12月10日 | 阅读数:1892

PUT /my_index
{
"settings": { "number_of_shards": 1 },
"mappings": {
"my_type": {
"properties": {
"title": {
"type": "string",
"analyzer": "english"
}
}
}
}
}

PUT /my_index/my_type/1
{ "title": "My rabbit jumps" }

PUT /my_index/my_type/2
{ "title": "Jumping jack rabbits" }

搜索语句:
{
"query": {
"match": {
"title": "jumping"
}
}
}

explain发现queryNorm都是0.5,结果导致两个文档得分一样。
queryNorm = 1/numTerms的平方根吗,为什么文档1是0.5
已邀请:

walter123 - IT

赞同来自:

标题打错了,是字段的词数(termNum)而不是字段的次数

medcl - 今晚打老虎。

赞同来自:

都是命中一个,字段总长度都是3, termNum 也都是3,请问哪里不一样?
得分不一样才怪了。

rochy - rochy_he

赞同来自:

对于 english 的分词器,默认会对单词进行归一化;
例如上述文本:Jumping 和 jumps 都会被归一化到 jump
在搜索 jumping 的时候,其实搜索的是 jump 因此文档 1 和 文档 2 在词数一致的情况下得分一致

rochy - rochy_he

赞同来自:

实际测试,最终得分是不一样的;
其中:
idf  = log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) = log(1 + (2 - 2 + 0.5) / (2 + 0.5)) = 0.18232156
 
tfNorm = (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) 
 
k1 和 b 是两个固定参数;
fieldLength 不一样,一个是 3 一个是 4
avgFieldLength = (3+4)/2 = 3.5
 
最终得分不一致
你可以把你 2.x 的 explain 结果贴一下
 
 
 

medcl - 今晚打老虎。

赞同来自:

哦,想起来了,你测试的版本的是2.x,5.0之前都是 TF/IDF 的评分,5.0之后是 BM25,BM25比 TF/IDF多了一个字段的长度参数。
因为你的两个文档的TF 和 IDF 都是一样,所以这就是为什么你的两个文档评分一样的原因。

要回复问题请先登录注册