Kibana 相同数据的ElasticSearch评分问题

cunj1qz1  于 2022-12-09  发布在  Kibana
关注(0)|答案(1)|浏览(106)

我有一个弹性索引与以下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"
        }
      }
    ]
  }
}

但是我不明白为什么给文档不同的分数是有弹性的,尽管所有的文档都匹配查询并且都在同一个碎片中。没有人有其他字段,或者所有的文档都是同样唯一的,那么为什么结果会有这样的变化??为什么雀斑标签文档比证明文档获得更多的分数?

emeijp43

emeijp431#

是否从索引中删除了任何文档?
当我第一次创建索引和查询时,我对所有4个文档都得到了相同的分数。然后,当我再添加3个文档并删除它们时,我得到的结果与你在问题中得到的结果相似。
这背后的原因是因为elasticsearch不会立即删除文档,而是将其标记为删除。这些文档是不可搜索的。因此,用于评分相关性的指标也包括已删除文档的指标。
您可以在查询中使用explain:true来检查这一点。在idf的分数计算中,您将看到N(包含该字段的文档总数)实际上与索引中的文档数不同。在我的示例中,当索引中的文档总数为4时,N为7。
您可以检查删除逻辑here背后的原因。

相关问题