OK - 何が起こっているのか、ようやくわかりました。まず、gist では、緯度/経度が原因で、クエリがどのドキュメントにも一致しません。ランダムに 1 つのドキュメント (323) を選択し、そこから緯度/経度の値を使用します。
これは私が得る説明です:
- custom score, score mode [total] | 0.8795
- Score based on score mode Max and child doc range from 10 to 16 | 1.0000
- Child[16] | 1.0000
- custom score, product of: | 0.2000
- match filter: cache(object_max_rooms:[4 TO *]) | 1.0000
- scriptFactor | 0.2000
- queryBoost | 1.0000
- custom score, product of: | 0.5714
- match filter: cache(object_min_living_area:[* TO 125]) | 1.0000
- scriptFactor | 0.5714
- queryBoost | 1.0000
- custom score, product of: | 0.1081
- match filter: cache(object_max_living_area:[125 TO *]) | 1.0000
- scriptFactor | 0.1081
- queryBoost | 1.0000
ご覧のとおり、緯度/経度は正確に一致するため、スコアは 1 であり、custom_filters_score
クエリからのスコアは適切に合計されています。
次に、lat
値を 50.0852386 から 50.0882386 に変更し、再実行しました。スコアは次のようになります。
- custom score, score mode [total] | 0.7081
- Score based on score mode Max and child doc range from 10 to 16 | 0.8050
- Child[16] | 0.8050
- custom score, product of: | 0.2000
- match filter: cache(object_max_rooms:[4 TO *]) | 1.0000
- scriptFactor | 0.2000
- queryBoost | 1.0000
- custom score, product of: | 0.5714
- match filter: cache(object_min_living_area:[* TO 125]) | 1.0000
- scriptFactor | 0.5714
- queryBoost | 1.0000
- custom score, product of: | 0.1081
- match filter: cache(object_max_living_area:[125 TO *]) | 1.0000
- scriptFactor | 0.1081
- queryBoost | 1.0000
したがって、フィルターからのスコアはクエリからのスコアと結合され、正規化されます。これは予想されることです。はscore_mode
フィルターにのみ適用され、フィルターとクエリの組み合わせには適用されません。
それらを正確に組み合わせたい場合は、距離計算をクエリからフィルターの下のcustom_filters_score
フィルターに移動する必要があります。問題は、script
for スコアリング がネストされたドキュメントにアクセスplaces
できないため、それを行うことができないことです。
正確な合計がなぜそれほど重要なのでしょうか? を絶対値と見なしては_score
なりません。各ドキュメントの相対的な重要性を反映しているだけです。要件に対して「正しい」順序が得られるまで、各句の影響を微調整するだけです。