複数の基準を持つ検索があります。
各基準 ( でグループ化should
) には、異なる加重スコアがあります。
ElasticSearch は結果のリストを返します。それぞれにスコアがあります-これは私には任意のスコアのようです。これは、そのスコアの分母が見つからないためです。
私の質問は、各スコアをどのように比率として表すことができるかということです。
各スコアを で割るmax_score
と、検索条件に 100% 一致するベスト マッチが表示されるため、うまくいきません。
複数の基準を持つ検索があります。
各基準 ( でグループ化should
) には、異なる加重スコアがあります。
ElasticSearch は結果のリストを返します。それぞれにスコアがあります-これは私には任意のスコアのようです。これは、そのスコアの分母が見つからないためです。
私の質問は、各スコアをどのように比率として表すことができるかということです。
各スコアを で割るmax_score
と、検索条件に 100% 一致するベスト マッチが表示されるため、うまくいきません。
計算は、使用_score
するクエリの組み合わせによって異なります。たとえば、次のような単純なクエリです。
{ "match": { "title": "search" }}
以下を組み合わせて、Lucene のTFIDFSimilarityを使用します。
用語頻度 (TF):この文書のフィールドにその用語が何回search
出現するか? title
回数が多いほど高得点
逆ドキュメント頻度 (IDF): 用語がインデックス内のすべてのドキュメントのフィールドに何回search
出現するか? title
頻度が高いほどスコアが低くなる
フィールド ノルム: フィールドの長さはtitle
? フィールドが長いほど、スコアは低くなります。( のような短いフィールドは、 のようtitle
な長いフィールドよりも重要であると見なされますbody
。)
クエリの正規化係数。(無視してよい)
一方、次のbool
ようなクエリ:
"bool": {
"should": [
{ "match": { "title": "foo" }},
{ "match": { "title": "bar" }},
{ "match": { "title": "baz" }}
]
}
一致する for each 句を計算し、_score
それらを合計してから、句の総数で割ります (もう一度、クエリの正規化係数を適用します)。
したがって、使用しているクエリに完全に依存します。
パラメータをクエリに_score
追加すると、 がどのように計算されたかの詳細な説明を取得できます。explain
curl localhost:9200/_search?explain -d '
{
"query": ....
}'
私の質問は、各スコアをどのように比率として表すことができるかということです。
クエリで何をしたいのかを理解していないと、これに答えることができません。ユース ケースによっては、function_score
クエリを使用して独自のスコアリング アルゴリズムを実装できます。