0

我正在尝试使用 elasticsearch-dsl 库,但不幸的是它没有很好的记录。

我有以下过滤器,它有效。

首先,我发现我需要搜索多远。

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')

它只是返回:

平均(字段='询问')

我还需要它来进行有趣的计算,而不仅仅是简单的计算。我需要问 + (spread / 2)

IE

s = s.aggs.bucket('average', 'avg', field='ask + (spread / 2')

有没有人有任何想法?

当我们在这里时,我需要将其扩展为整数类型,它目前是一个字符串。我首先使用python创建索引;我很高兴删除我的索引并重新开始,但我不知道如何在创建时在 python 中指定字段类型。

4

2 回答 2

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

于 2017-01-18T15:56:21.497 回答
0

在你做之后s = s.aggs.bucket('average', 'avg', field='ask')

result = s.execute()

然后你result.aggs.to_dict()会告诉你 agg 结果

于 2017-11-07T00:25:54.980 回答