我们正在使用弹性搜索来获取一些数据。
请告诉我如何获取聚合_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
}
答案 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文档了解更多信息。