3

いくつかの関数で複雑なランキングを作成し、重み付けして 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 になるようです...なぜですか?

4

1 に答える 1

1

これは、提供しているシード値の問題だと思います。シード値は、ランダム スコアの計算に使用されます。同じシード値は常に同じ乱数を与えます。

したがって、クエリからシード値を削除すると、正常に機能するはずです。このサンプルを参照できます-

"function_score": {
    "query": ...,
    "functions": [
        {
            "random_score" : {
            },
            "weight": 0.1
        },
        {
            "field_value_factor": {
                "field":    "score"
            },
            "weight": 1
        }
    ],
    "score_mode": "multiply"
}

シード値を使用する場合は、非常に大きな数値を使用してみてください。

于 2015-01-10T15:45:07.777 に答える