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
{
"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
5 个回复
walter123 - IT
赞同来自:
medcl - 今晚打老虎。
赞同来自:
得分不一样才怪了。
rochy - rochy_he
赞同来自:
例如上述文本: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 - 今晚打老虎。
赞同来自:
因为你的两个文档的TF 和 IDF 都是一样,所以这就是为什么你的两个文档评分一样的原因。