ご提供いただいた数値を使用して簡単な計算を実行すると、期待どおりの結果が得られます。
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に2つの同一のドキュメントがあり、shard_2に1つのドキュメントがある場合、shard_1のドキュメントはshard_2のドキュメントよりもスコアが低くなります。
データが増えると、ドキュメントの頻度はシャード全体で均等になる傾向があります。ただし、少量のデータをテストする場合は、シャードが1つだけのインデックスを作成するかsearch_type=dfs_query_then_fetch
、クエリ文字列パラメータに追加する必要があります。
これにより、スコアを計算する前に、関連するすべてのシャードのグローバルドキュメント頻度が計算されます。
クエリでに設定explain
するtrue
と、スコアがどのように計算されているかを正確に確認できます