弹性搜索 - 如何获取聚合嵌套_source值

时间:2016-10-14 00:48:29

标签: elasticsearch

我们正在使用弹性搜索来获取一些数据。

请告诉我如何获取聚合_source.eventName组数据。 喜欢这个sql

seletc eventName, count(eventName) from events group by eventName;

这是我的aggs查询和当前响应数据结构。

{
    type: 'event',
    size: 3,
    aggs: {
      event_group: {
        terms: {
          field: 'eventName'
        }
      }
    }
}

"hits": {
  "hits": [
    {
      "_type": "event",
      "_source": {
        "eventName": "event1",
      }
    },
    {
      "_type": "event",
      "_source": {
        "eventName": "event1",
      }
    },
    {
      "_type": "event",
      "_source": {
        "eventName": "event2",
      }
    }
  ]
}

※理想情况(我想得到这样的结果。)

{
  "eventName": "event1",
  "count": 2
},
{
  "eventName": "event2",
  "count": 1
}

2 个答案:

答案 0 :(得分:0)

ElasticSearch不支持此过滤,但您可以使用REST API过滤器参数,它将返回给您,如

GET ... / _ search?pretty& filter_path = hits.hits._source。*

  "hits": {
    "hits": [
      {
        "_source": {...},
        "_source": {...},
        "_source": {...},
       }]
    }

关于常见选项的弹性搜索Documentation

答案 1 :(得分:0)

您的查询几乎正确无误。如果您只想要eventName s的计数,请使用size: 0而不是3。它会告诉ES不要返回hits

响应应该具有aggregations属性,如下所示:

{
    "aggregations":
        {
            "event_group": {
                "doc_count_error_upper_bound": 0,
                "sum_other_doc_count": 0, 
                "buckets" : [ 
                    {
                        "key" : "event1",
                        "doc_count" : 10
                    },
                    {
                        "key" : "event2",
                        "doc_count" : 10
                    },
                    {
                        "key" : "event3",
                        "doc_count" : 10
                    },
                ]
            }
        }
}

doc_count属性有您正在寻找的计数。

注意: ES只会返回广告资源中的前10个eventName。根据您使用的ES版本,如果您想获得所有唯一的eventName,则需要在size聚合中指定terms。阅读ES文档了解更多信息。