【问题标题】:Aggregation Filter in ES DSLES DSL 中的聚合过滤器
【发布时间】:2017-01-27 14:59:10
【问题描述】:

我有以下聚合过滤器:

“聚合”:{ “agg_name”:{ “过滤器”:{“存在”:{“字段”:“归档名称”}} } } }

但我想用elasticsearch-dsl 写得更干净。这是我能做的最好的:

aggs.bucket('agg_name', {"filter": {"exists": {"field": "field_name"}}})

但我知道有一种更清洁的方法。一些失败的尝试:

  • aggs.bucket('agg_name', A('filter', type='exists', field='field_name'))
  • aggs.bucket('agg_name', A('filter','exists', field='field_name'))
  • aggs.bucket('agg_name', A().filter('exists', field='field_name'))
  • aggs.bucket('agg_name').filter('exists', field='field_name')

我目前无法从文档中获取正确的信息。能不能写得更像DSL?

【问题讨论】:

    标签: python elasticsearch elasticsearch-dsl


    【解决方案1】:

    你还没有尝试过:

    aggs.A('filter', query.Q('exists', field='field_name'))
    

    更多示例可以在unit test source code中找到

    【讨论】:

    • 嗨,Val,我知道你之前发布了这个,但你能从这段代码 sn-p 的角度解释一下吗? s = Search(using=client) s.aggs.bucket('some_bucket_by_day', 'date_histogram', field='time_field', interval='day') .metric('some_avg', 'avg', field='some_field' ) 我想以某种方式过滤这个吗? filter='range', **{'time_field': {'gte': 'now-10d'}}
    • @jeff_new 你会发布一个新问题吗,因为 cmets 中的代码不太清晰,谢谢 ;-)
    • @Jesse 你对上面的答案有什么好运气吗?
    • 这是一个很好的选择。这是新帖子:stackoverflow.com/questions/63056160/…
    • 嗨 Val,忘记感谢您的新帖子建议。我试图通过单元测试源代码无济于事。非常感谢任何帮助!
    【解决方案2】:
    s.aggs.bucket("bucket_name", "filter",
                          query.Q("term", fieldname='vale')).metric('field', 'sum', field="whatever")
    

    这对我有用

    【讨论】:

      【解决方案3】:

      对于看起来更像其他 DSL 聚合的语法,您可以使用

      s.aggs.bucket("filtered", 
          A("filter", filter=Term(my_field="my_value"))
      )
      

      【讨论】:

        猜你喜欢
        • 2019-11-01
        • 1970-01-01
        • 2020-11-13
        • 2015-09-17
        • 2014-02-02
        • 2017-03-09
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多