2017-01-17 10 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') 

Тогда я бегу мой поиск с фильтром

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

После этого мне нужно запустить некоторые Aggs. У меня есть следующий, но он не работает:

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

Он просто возвращается обратно:

Avg (поле = «спросить»)

мне нужно это сделать забавный расчет, не просто что-то прямое. Мне нужно спросить + (распространяется/2)

т.е.

s = s.aggs.bucket ('средний', 'средний', поле = 'спрашивать + (распространяется/2')

ли у кого есть какие-то идеи?

В то время как мы здесь, мне нужно, чтобы спред целочисленного типа, в настоящее время это строка. Я использовал python для создания индекса в первую очередь, я рад удалить свой индекс и начните снова, но я не знаю, как указать тип поля в python, когда он будет создан.

ответ

0

Что специфицирует агрегаты, которые вы не должны назначать обратно на 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': {'filter': [{'range': {'timestamp': {'gt': '1484749397.311207'}}}]}}, ' aggs ': {' average ': {' avg ': {' script ': {' inline ':' doc ["ask"]. value + doc ["spread"]. значение/2 '}}}},' sort_keys ': True,' size ': 50000} ' вернулся, когда я печатаю dict. –

+0

О, пожалуйста, просто переходите к датам, не нужно сериализовывать их в метку времени. Если вы выполните сериализацию, убедитесь, что они совместимы с elasticsearch, который использует миллисекундную точность ('timestamp * 1000' в python). –

0

после выполнения s = s.aggs.bucket('average', 'avg', field='ask')

сделать result = s.execute()

затем ваш result.aggs.to_dict() покажет вам agg результат