2013-03-13 48 views
0

我插入了一些文档,除了一个浮点字段外,它们都是相同的,名为aelasticsearch custom_score乘法不准确

custom_score查询的script设置为_score时,对于与某些字段匹配的特定查询,结果得分为0.40464813。当script然后更改为_score * a(mvel)对于相同的查询,其中a是9.908349251612433,最终得分变为4.0619955。

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

  • 4.0619955(elasticsearch)
  • 4.009394996051871(铬)

这是一个相当差和产生的结果的不正确的排序。为什么会这样呢,并且有办法纠正它吗?

回答

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 
# } 

我认为你正在运行到这里什么是跨多个碎片测试数据太少。

文档频率默认按每个分片计算。因此,如果shard_1上有两个相同的文档,shard_2上有一个文档,那么shard_1上的文档将低于shard_2上的文档。

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

这会在计算分数之前计算所有相关碎片的全局文档频率。

如果您在查询中设置explaintrue,然后就可以看到究竟是如何被计算出你的分数