【问题标题】:How to do multi value count aggregation in elasticsearch如何在elasticsearch中进行多值计数聚合
【发布时间】:2015-02-05 22:34:14
【问题描述】:

有没有办法进行“多值计数”聚合? 它的工作方式与常规值计数相同:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-valuecount-aggregation.html

但会被用于计算多个字段。

例如我们有一个映射:

"properties" : {
        "lastName" : { "type" : "string" },
        "firstName" : { "type" : "string" },
        "age" : { "type" : "string" }
}

以及以下 4 个文档:

{"lastName":"Smith"}
{"lastName":"Jacobson", "firstName":"Scott"}
{"lastName":"Bush", "age": 68}
{"lastName":"Obama", "firstName":"Barack", "age":53}

我想计算带有年龄或名字的文档的数量。 在我的情况下,聚合将返回 3。

有什么想法吗?我尝试使用脚本功能:

"aggregation_name" : {
  "value_count" : {
    "script" : "doc['age'].value + doc['firstName'].value"
  }
}

但它似乎没有用。

谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用filter aggregationExists filter 来实现这一点 -

    {
      "aggs": {
        "CountSpec": {
          "filter": {
            "bool": {
              "should": [
                {
                  "exists": {
                    "field": "age"
                  }
                },
                {
                  "exists": {
                    "field": "firstName"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    【讨论】:

    • 我设法实现了我想要的:"count_name" : { "value_count" : { "script" : "if(doc.containsKey('age') || doc.containsKey('firstName')) { 1 }" } } 知道什么是最好的:过滤器聚合或使用脚本的值聚合?
    • 当然是过滤方法。脚本是 CPU 密集型的,过滤器是本地构建的。更重要的是脚本具有过滤缓存,这意味着一旦缓存执行会更快
    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 2018-04-20
    • 2017-01-28
    • 2020-12-19
    • 1970-01-01
    • 2021-08-13
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多