如果我使用您提供的数字进行简单计算,那么我会得到您期望的结果。
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
添加到查询字符串参数中。
这会在计算分数之前计算所有相关碎片的全局文档频率。
如果您在查询中设置explain
到true
,然后就可以看到究竟是如何被计算出你的分数