我有一个弹性索引与以下4个文件。
PUT test/_doc/1
{
"tag" : "prove"
}
PUT test/_doc/2
{
"tag" : "prove"
}
PUT test/_doc/3
{
"tag" : "freckle"
}
PUT test/_doc/4
{
"tag" : "freckle"
}
在这上面我运行一个简单的查询来挑选文档,标签要么是prove要么是feckle。
查询-
GET test/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"tag": "prove freckle"
}
}
]
}
}
}
结果-
{
"took" : 950,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : 0.87546873,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "3",
"_score" : 0.87546873,
"_source" : {
"tag" : "freckle"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "4",
"_score" : 0.87546873,
"_source" : {
"tag" : "freckle"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.53899646,
"_source" : {
"tag" : "prove"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.53899646,
"_source" : {
"tag" : "prove"
}
}
]
}
}
但是我不明白为什么给文档不同的分数是有弹性的,尽管所有的文档都匹配查询并且都在同一个碎片中。没有人有其他字段,或者所有的文档都是同样唯一的,那么为什么结果会有这样的变化??为什么雀斑标签文档比证明文档获得更多的分数?
1条答案
按热度按时间emeijp431#
是否从索引中删除了任何文档?
当我第一次创建索引和查询时,我对所有4个文档都得到了相同的分数。然后,当我再添加3个文档并删除它们时,我得到的结果与你在问题中得到的结果相似。
这背后的原因是因为elasticsearch不会立即删除文档,而是将其标记为删除。这些文档是不可搜索的。因此,用于评分相关性的指标也包括已删除文档的指标。
您可以在查询中使用explain:true来检查这一点。在idf的分数计算中,您将看到N(包含该字段的文档总数)实际上与索引中的文档数不同。在我的示例中,当索引中的文档总数为4时,N为7。
您可以检查删除逻辑here背后的原因。