いくつかの関数で複雑なランキングを作成し、重み付けして search _score で乗算したいと考えています。これは function_score -> functions パラメータで可能であることを理解しています。これが私が持っているものです(注、これはPythonです):
"function_score": {
"query": ...,
"functions": [
{
"random_score" : {
"seed": seed
},
"weight": 0.1
},
{
"field_value_factor": {
"field": "score"
},
"weight": 1
}
],
"score_mode": "multiply"
}
ノート:
- 各ドキュメントには、0 から 1 までの数値を含む「スコア」フィールドがあります。
- 「シード」は、ユーザー ID と現在の日付に基づいて生成されます
観察された動作:
- field_value_factor 関数をコメントアウトすると、結果はランダムにランク付けされます。
- random_score 関数をコメントアウトすると、結果はスコア フィールド順に並べられます。
- 何もコメントアウトしない場合、結果はランダムのみの場合と同じです: 2 番目の関数は無視されるようです
- 重みを極端な値に変更しても、ランキングに違いはありません
- また、field_value_factor 関数内で「factor」を使用しても何も起こりません。
- 順序を入れ替えても動作は変わりません...
私は何を間違っていますか?これをデバッグする他の方法はありますか?
編集:出力の説明
説明コマンドについて知りました!これは、最高スコアの結果の出力です。頭を包み込もうとして…
"_explanation": {
"value": 0,
"description": "function score, product of:",
"details": [
{
"value": 1,
"description": "ConstantScore(*:*), product of:",
"details": [
{
"value": 1,
"description": "boost"
},
{
"value": 1,
"description": "queryNorm"
}
]
},
{
"value": 0,
"description": "Math.min of",
"details": [
{
"value": 0,
"description": "function score, score mode [multiply]",
"details": [
{
"value": 90500,
"description": "function score, product of:",
"details": [
{
"value": 1,
"description": "match filter: *:*"
},
{
"value": 90500,
"description": "product of:",
"details": [
{
"value": 9.05,
"description": "field value function: (doc['score'].value * factor=10.0)"
},
{
"value": 10000,
"description": "weight"
}
]
}
]
},
{
"value": 0,
"description": "function score, product of:",
"details": [
{
"value": 1,
"description": "match filter: *:*"
},
{
"value": 0,
"description": "product of:",
"details": [
{
"value": 0,
"description": "random score function (seed: 16121)"
},
{
"value": 0.01,
"description": "weight"
}
]
}
]
}
]
},
{
"value": 3.4028235e+38,
"description": "maxBoost"
}
]
},
{
"value": 1,
"description": "queryBoost"
}
]
}
編集2:
したがって、ランダム関数は常に 0 を返し、それを他の要素と乗算すると、もちろん合計は 0 になるようです...なぜですか?