我插入了一些文档,除了一个名为a
的浮点字段外,它们都是相同的。
当script
查询的custom_score
设置为_score
时,对于与某些字段匹配的特定查询,得分为0.40464813。当script
对同一查询更改为_score * a
(mvel)时a
为9.908349251612433,最终得分为4.0619955。
现在,如果我通过Chrome的JS控制台运行此计算,我会得到4.009394996051871。
这是一个很大的不同,并产生错误的结果排序。为什么会这样,有没有办法纠正它?
答案 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
,那么您可以准确了解您的分数的计算方式