elasticsearch custom_score乘法是不准确的

时间:2013-03-13 06:54:07

标签: elasticsearch

我插入了一些文档,除了一个名为a的浮点字段外,它们都是相同的。

script查询的custom_score设置为_score时,对于与某些字段匹配的特定查询,得分为0.40464813。当script对同一查询更改为_score * a(mvel)时a为9.908349251612433,最终得分为4.0619955。

现在,如果我通过Chrome的JS控制台运行此计算,我会得到4.009394996051871。

  • 4.0619955(elasticsearch)
  • 4.009394996051871(Chrome)

这是一个很大的不同,并产生错误的结果排序。为什么会这样,有没有办法纠正它?

1 个答案:

答案 0 :(得分:1)

如果我使用您提供的数字进行简单计算,那么我会得到您期望的结果。

curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1'  -d '
{
   "a" : 9.90834925161243
}
'

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "query" : {
      "custom_score" : {
         "script" : "0.40464813 *doc[\u0027a\u0027].value",
         "query" : {
            "match_all" : {}
         }
      }
   }
}
'

# {
#    "hits" : {
#       "hits" : [
#          {
#             "_source" : {
#                "a" : 9.90834925161243
#             },
#             "_score" : 4.009395,
#             "_index" : "test",
#             "_id" : "lPesz0j6RT-Xt76aATcFOw",
#             "_type" : "test"
#          }
#       ],
#       "max_score" : 4.009395,
#       "total" : 1
#    },
#    "timed_out" : false,
#    "_shards" : {
#       "failed" : 0,
#       "successful" : 5,
#       "total" : 5
#    },
#    "took" : 1
# }

我认为你在这里遇到的是测试多个分片中的数据太少。

默认情况下,每个分片计算Doc频率。因此,如果您在shard_1上有两个相同的文档,而在shard_2上有一个文档,那么shard_1上的文档得分将低于shard_2上的文档。

有了更多数据,文档频率往往会超过分片。但是,在测试少量数据时,您要么只想创建一个只有一个分片的索引,要么将search_type=dfs_query_then_fetch添加到查询字符串参数中。

在计算得分之前,计算所有相关分片的全局doc频率。

如果您在查询中将explain设置为true,那么您可以准确了解您的分数的计算方式