2017-01-17 8 views
0

私はelasticsearch-dslライブラリを使用しようとしていますが、残念ながらそれは十分に文書化されていません。elasticsearch-dsl - Pythonで平均を集める集計

私は以下のフィルタを使用しています。

最初に、私は自分の検索がどれくらい前に戻ってくるかを見つけます。

longtime = datetime.datetime.strptime(str(datetime.datetime.now() - datetime.timedelta(seconds=int(pairs[p][1]) + basehrs)), '%Y-%m-%d %H:%M:%S.%f').strftime('%s.%f') 

は、それから私は、私はいくつかのaggsを実行する必要があるのフィルタこの後

s = Search(using=es, index="history", doc_type=pairs[p][0]).filter('range', timestamp={'gte': longtime}) 

と私の検索を実行します。私は、次のを持っているが、それは動作しません:

s = s.aggs.bucket('average', 'avg', field='ask') 

ちょうど戻る:

平均(フィールドが=「尋ねる」)

私も、それが楽しいの計算を行うために必要はありませんちょっと単純です。私は(広がっ/ 2)+尋ねる必要

すなわち

S = s.aggs.bucket( '平均'、 '平均'、フィールド= '(広がっ+尋ねる/ 2')

ん誰でもアイデアがありますか?

私はここにいますが、整数型にする必要があります。現在は文字列です。私は最初にインデックスを作成するためにpythonを使用しました。再度開始しますが、作成時にpythonでフィールド型を指定する方法がわかりません。

答えて

0

Whan指定sに割り当ててはならない集計は、集計が変更されます。あなたは[0]スクリプトを指定(してelasticsearchで有効なスクリプトを持っている)必要があるスクリプトの集約のために

s.aggs.metric('average', 'avg', script={'inline': "doc['ask'].value + doc['spread'].value/2"}) 

0 - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-avg-aggregation.html#_script

+0

こんにちは、私は援助に感謝します。私は数時間前からそれをやり遂げてきました。私は次のようになっています: '{'query':{'bool':{'フィルタ': '{'範囲 ':{'タイムスタンプ ':{' gt ':' 1484749397.311207 '}}}}}} '平均':{'平均':{'スクリプト':{'インライン': 'ドキュメント' [質問]]値+ドキュメント["スプレッド"]値/ 2 '}}}}、' 「sort_keys」:True、「size」:50000} ' が返されます。 –

+0

ああ、datetimesを渡すだけで、タイムスタンプにシリアル化する必要はありません。シリアル化する場合は、ミリ秒精度(Pythonの 'timestamp * 1000')を使用するelasticsearchと互換性があることを確認してください。 –

0

あなたはs = s.aggs.bucket('average', 'avg', field='ask')

を行った後は、result = s.execute()を行います

あなたのresult.aggs.to_dict()はあなたに結果を表示します

関連する問題