我想要实现的是通过唯一对(city,STATE)进行聚合。根据Elasticsearch文档术语聚合不支持从同一文档中的多个字段收集术语。因此我创建了一个嵌套的agg:
{
"size": 0,
"aggs": {
"cities": {
"terms": {
"field": "address.city",
"size": 12
},
"aggs": {
"states": {
"terms": {
"field": "address.stateOrProvince"
},
"aggs": {
"topCity": {
"top_hits": {
"size": 1,
"sort": [
{
"price.value": {
"order": "desc" }}]}}}}}}}}
由于这种聚合,我得到这样的回应:
{
"aggregations": {
"cities": {
"buckets": [
{
"key": "las vegas",
"doc_count": 5927,
"states": {
"buckets": [
{ "key": "nv", "doc_count": 5840 },
{ "key": "nm", "doc_count": 85 }
]
}
},
{
"key": "jacksonville",
"doc_count": 5689,
"states": {
"buckets": [
{ "key": "fl", "doc_count": 2986 },
{ "key": "nc", "doc_count": 1962 },
{ "key": "ar", "doc_count": 290 }]}}]}}}
问题是如何按最深的doc_count排序结果?
预期的有序列表应该是这样的:
答案 0 :(得分:2)
我不相信有多种方法可以对多个存储桶中的内部doc_count进行排序。在ES 2.0(仍处于测试版)中,您将能够对聚合采取行动,但这在ES 1.x中是不可能的
答案 1 :(得分:0)
我通过应用transform
设法解决了这个问题"transform": {
"script": "ctx._source['address']['cityState'] = ctx._source['address']['city'] + ', ' + ctx._source['address']['state']"
}
然后聚合新添加的字段。按预期工作!