【问题标题】:elasticsearch_dsl: Generate multiple buckets in aggregationelasticsearch_dsl:在聚合中生成多个桶
【发布时间】:2018-05-01 00:18:19
【问题描述】:

我想生成这个:

GET /packets-2017-09-25/_search
{
  "size": 0,
  "query": {
        "match": {
            "transport_protocol": "tcp"
        }
  },
  "aggs": {
    "clients": {
      "terms": {
        "field": "layers.ip.src.keyword",
        "size": 1000,
        "order":{ "num_servers.value":"desc" }
      },
      "aggs": {
        "num_servers": {
          "cardinality": {
            "field": "layers.ip.dst.keyword",
            "precision_threshold" : 40000
          } 
        },
        "server_list": {
          "terms": {
            "field": "layers.ip.dst.keyword"
          }
        }
      }
    }
  }
}

即我想要两个存储桶 (num_servers) 和 (server_list) 在客户端下。

我正在尝试以下代码,但出现错误:

def get_streams_per_client(proto='tcp', max=40000):
    s = Search(using=client, index="packets-2017-09-25") \
               .query("match", transport_protocol=proto)
    s.aggs.bucket('clients', 'terms', field='layers.ip.src.keyword', size=max, order={"num_servers.value":"desc"})\
    .bucket('num_servers', 'cardinality', field='layers.ip.dst.keyword', precision_threshold=40000)\
    .bucket('server_list', 'terms', field='layers.ip.dst.keyword')
    s = s.execute()
    <snip>

我认为我缺少正确的语法。感谢一些指导。

【问题讨论】:

    标签: elasticsearch-dsl elasticsearch-dsl-py


    【解决方案1】:

    如果您想定义其他子聚合,您始终可以使用["name"] 表示法达到现有聚合:

    s = Search().query('match', transport_protocol='tcp')
    s.aggs.bucket('clients', 'terms', field='layers.ip.src.keyword', size=max, order={"num_servers.value":"desc"})
    s.aggs['clients'].metric('num_servers', 'cardinality', field=..., precision_threshold=...)
    s.aggs['clients'].bucket('server_list', 'terms', ...)
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      在 elasticsearch_dsl 项目页面上从 Honza 那里得到答案:

        s = Search(using=client, index="packets-2017-09-25").query('match', transport_protocol=proto)
        s.aggs.bucket('clients', 'terms', field='layers.ip.src.keyword', size=max, order={"num_servers.value":"desc"})
        s.aggs['clients'].bucket('num_servers', 'cardinality', field='layers.ip.dst.keyword', precision_threshold=40000)
        s.aggs['clients'].bucket('server_list', 'terms', field='layers.ip.dst.keyword')
        print json.dumps(s.to_dict(), indent=4)
        s = s.execute()
      

      【讨论】:

      • 好吧,你也先从我这里得到它:)
      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2022-01-04
      • 2017-03-13
      相关资源
      最近更新 更多