【问题标题】:elasticsearch-dsl - Aggregates collecting average in pythonelasticsearch-dsl - 在 python 中聚合收集平均值
【发布时间】:2017-01-17 23:27:39
【问题描述】:

我正在尝试使用 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)

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

有人有什么想法吗?

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

【问题讨论】:

    标签: python python-3.x elasticsearch-dsl elasticsearch-py


    【解决方案1】:

    如果指定不应该分配回 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

    【讨论】:

    • 嗨,伙计,感谢您的帮助。我已经玩了几个小时了,但我无法让它继续下去。我得到:{'query': {'bool': {'filter': [{'range': {'timestamp': {'gt': '1484749397.311207'}}}]}}, 'aggs': {'average': {'avg': {'script': {'inline': 'doc["ask"].value + doc["spread"].value/2'}}}}, 'sort_keys': True, 'size': 50000} 当我打印字典时返回。
    • 哦,请直接传入日期时间,不需要将它们序列化为时间戳。如果您对它们进行序列化,请确保它们与使用毫秒精度的弹性搜索兼容(python 中的timestamp * 1000)。
    【解决方案2】:

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

    result = s.execute()

    然后您的result.aggs.to_dict() 将向您显示 agg 结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多