6

ElasticSearch クエリの 1 つで、関数スコアを定義し、それによって並べ替えたいと思います。関数 score は、計算されたスコアを取得し、ブースト値を追加します。各ドキュメントには、数値フィールドに格納されたブースト値があります。

このような:

{
    "from": 0,
    "size": 10,
    "query": {
        "function_score": {
            "functions": [
                {
                    "script_score": {
                        "script": "_score + doc['boostFactor'].value"
                    }
                }
            ],
            "query": {
                "filtered": {
                    "query": {
                        "query_string": {
                            "query": "search for this!"
                        }
                    }
                }
            },
            "boost_mode": "replace"
        }
    }
}

これまでのところ、これはうまくいきます。問題は次のとおりです。今後、各ドキュメントにはブースト値の配列が含まれます。

"boostFactor": [ 0, 0.5, 1, 3 ]

クエリを起動するときに、事前定義されたインデックスに基づいて、スクリプト スコアが配列の特定の要素を選択するようにしたいと思います。たとえば、index=2 とすると、スクリプト スコアは次のようになります。

                "script_score": {
                    "script": "_score + doc['boostFactor'][2].value"
                }

残念ながら、ElasticSearch はこれを受け入れません。

...Query Failed [Failed to execute main query]]; 
nested: CompileException[[Error: unexpected token in constructor]...

何か案は?

4

1 に答える 1

7

doc['boostFactor'].value単一の値を返します。配列全体を取得するには、doc['boostFactor'].values;を使用します。次に、期待どおりに配列内の特定のインデックスを取得できます。

            {
                "script_score": {
                    "script": "_score + doc['boostFactor'].values[2]"
                }
            }

詳細については、Elasticsearch ドキュメントのスクリプト セクションを参照してください: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html

于 2013-11-07T16:55:26.537 に答える