0

と呼ばれる 1 つの浮動小数点フィールドを除いてすべて同一のドキュメントをいくつか挿入しましたa

クエリの が just に設定されている場合script、一部のフィールドに一致する特定のクエリのスコアは 0.40464813 になります。次に、同じクエリで を (mvel) に変更すると( isは 9.908349251612433)、最終的なスコアは 4.0619955 になります。custom_score_scorescript_score * aa

Chrome の JS コンソールでこの計算を実行すると、4.009394996051871 が得られます。

  • 4.0619955 (エラスティックサーチ)
  • 4.009394996051871 (クローム)

これはかなりの違いであり、結果の順序が正しくありません。それはなぜですか、それを修正する方法はありますか?

4

1 に答える 1

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に2つの同一のドキュメントがあり、shard_2に1つのドキュメントがある場合、shard_1のドキュメントはshard_2のドキュメントよりもスコアが低くなります。

データが増えると、ドキュメントの頻度はシャード全体で均等になる傾向があります。ただし、少量のデータをテストする場合は、シャードが1つだけのインデックスを作成するかsearch_type=dfs_query_then_fetch、クエリ文字列パラメータに追加する必要があります。

これにより、スコアを計算する前に、関連するすべてのシャードのグローバルドキュメント頻度が計算されます。

クエリでに設定explainするtrueと、スコアがどのように計算されているかを正確に確認できます

于 2013-03-13T10:56:57.330 に答える