これは私にとって正しく機能します:
search = Search(using=client, index='my_index').script_fields(
special={'script': {
'source': "<a formula that produces a double>"}
}
)
special
そして今、すべてのヒットにフィールドの合計を付けたいと思います。私はこれを試しました:
search = Search(using=client, index='my_index').script_fields(
special={'script': {
'source': "<a formula that produces a double>"}
}
).aggs.metric('total', 'sum', field='special')
しかしaggs
、応答の属性を確認すると、
{'total': {'value': 0.0}}
応答自体はspecial
、各エントリに正しく入力されていることを示しており、常に肯定的です。合計が発生したときに周りにいないように見えるspecial
ので、elasticsearch はそれを認識せず、合計を0
. pipeline
の代わりに試してみましたmetric
が、状況は変わりませんでした。私が提案していることは可能であるべきですよね?
Elasticsearch ではなくスクリプトで合計を計算することもできますが、ES 側の合計ははるかに高速になると確信しています。
アップデート
このelasticsearchフォーラムでの議論に基づいて、私はそれが機能するはずの方法を見つけたと思いますが、それでも私にとっては適切に機能していません. 次のように、集計内にスクリプトを提供します。
s=Search(using=client, index='my_index').aggs.pipeline('total', 'sum', script={'source': "<the special formula>"})
ここでの問題は、出力が正しくないことです。特定の時間の 1 つの項目を含むテスト インデックスで、合計集計でそのフィールドを報告しようとしましたが、期待される結果 (フィールドの値) の代わりに、128 異なる値が得られました。
アップデート
Elasticsearch ヘルプ フォーラムでこの最後の問題に対する回答を受け取りました: https://discuss.elastic.co/t/script-aggregation-yields-wrong-but-close-answer/133744/3?u=rschwieb
簡単に言えば、フィールドに格納されたデータはelasticsearchによってdoubleとして解釈されましたが、集計ではインデックスのマッピングによって決定されたタイプが使用されました(代わりに「float」と表示されました)。フィールドを double として再インデックスした後、数値は期待どおりになります。