【问题标题】:ElasticSearch count multiple fields grouped byElasticSearch 计算多个字段分组
【发布时间】:2019-09-09 20:55:07
【问题描述】:

我有类似的文件

{"domain":"US", "zipcode":"11111", "eventType":"click", "id":"1", "time":100}

{"domain":"US", "zipcode":"22222", "eventType":"sell", "id":"2", "time":200}

{"domain":"US", "zipcode":"22222", "eventType":"click", "id":"3","time":150}

{"domain":"US", "zipcode":"11111", "eventType":"sell", "id":"4","time":350}

{"domain":"US", "zipcode":"33333", "eventType":"sell", "id":"5","time":225}

{"domain":"EU", "zipcode":"44444", "eventType":"click", "id":"5","time":120}

我想按 eventType=sell 和 125 到 400 之间的时间过滤这些文档,按域分组,后跟邮政编码,并计算每个存储桶中的文档。所以我的输出就像(过滤器会忽略第一个和最后一个文档)

美国,11111,1

美国,22222,1

美国,33333,1

在 SQL 中,这应该很简单。但我无法让它在 ElasticSearch 上工作。有人可以帮我吗?

如何编写 ElasticSearch 查询来完成上述操作?

【问题讨论】:

    标签: elasticsearch filter count group-by


    【解决方案1】:

    这个查询似乎做你想做的事:

    POST /test_index/_search
    {
       "size": 0,
       "query": {
          "filtered": {
             "filter": {
                "bool": {
                   "must": [
                      {
                         "term": {
                            "eventType": "sell"
                         }
                      },
                      {
                         "range": {
                            "time": {
                               "gte": 125,
                               "lte": 400
                            }
                         }
                      }
                   ]
                }
             }
          }
       },
       "aggs": {
          "zipcode_terms": {
             "terms": {
                "field": "zipcode"
             }
          }
       }
    }
    

    返回

    {
       "took": 8,
       "timed_out": false,
       "_shards": {
          "total": 5,
          "successful": 5,
          "failed": 0
       },
       "hits": {
          "total": 3,
          "max_score": 0,
          "hits": []
       },
       "aggregations": {
          "zipcode_terms": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
                {
                   "key": "11111",
                   "doc_count": 1
                },
                {
                   "key": "22222",
                   "doc_count": 1
                },
                {
                   "key": "33333",
                   "doc_count": 1
                }
             ]
          }
       }
    }
    

    (请注意,“22222”只有 1 个“卖出”,而不是 2 个)。

    这是我用来测试它的一些代码:

    http://sense.qbox.io/gist/1c4cb591ab72a6f3ae681df30fe023ddfca4225b

    您可能想看看terms aggregationsbool filterrange filters

    编辑:我刚刚意识到我遗漏了域部分,但如果需要,也可以直接在其中添加存储桶聚合。

    【讨论】:

    • 我可以添加它。谢谢。
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 2020-03-03
    • 2016-11-19
    • 1970-01-01
    • 2021-05-27
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多