嵌套類型的基本概念就不講了,需要了解概念的,傳送門:https://www.cnblogs.com/just84/p/10936034.html
對於嵌套類型的字段,要使用ES專用的嵌套查詢
嵌套字段舉例:
brandInfo:[
{
"group": "xx",
"category": "xx",
"subCategory": "xx",
"brand": "xx",
"subBrand": "xx",
"propertyWord": [
"xx",
"xx",
"xx"
]
}
]
如果要獲取subBrand的分組 就需要這樣實現:
"aggs": {
"brandInfo": {
"nested": {
"path": "brandInfo"
},
"aggs": {
"brands": {
"terms": {
"field": "brandInfo.subBrand",
"size": xx
}
}
}
}
}
如果要在subBrand分組的條件上,進行propertyWord的分組,也很簡單:
"aggs": {
"brandInfo": {
"nested": {
"path": "brandInfo"
},
"aggs": {
"brands": {
"terms": {
"field": "brandInfo.subBrand",
"size": 10
},
"aggs": {
"property": {
"terms": {
"field": "brandInfo.propertyWord",
"size": 100
}
}
}
}
}
}
}
需求往往是多變的
如果突然在subBrand的分組下,還要進行 非嵌套字段 的分組,比如名稱,性別,年齡等,如何實現呢?
這個時候一般都會想,和上邊一樣唄,如下:
"aggs": {
"brandInfo": {
"nested": {
"path": "brandInfo"
},
"aggs": {
"brands": {
"terms": {
"field": "brandInfo.subBrand",
"size": 3
},
"aggs": {
"gender": {
"terms": {
"field": "gender",
"size": 3
}
}
}
}
}
}
}
但這樣是查不到性別分組數據的
原因是: 進入了嵌套桶中,只能操作嵌套字段.
后來了解到,可以通過 reverse_nested 跳出當前嵌套,並且 依然攜帶之前的分組條件
"aggs": {
"brandInfo": {
"nested": {
"path": "brandInfo"
},
"aggs": {
"brands": {
"terms": {
"field": "brandInfo.subBrand",
"size": 3
},
"aggs": {
"rev": {
"reverse_nested": {}, //跳出嵌套桶
"aggs": {
"age": {
"terms": {
"field": "gender",
"size": 3
}
}
}
}
}
}
}
}
}
問題解決.
用java實現也很簡單,相關的嵌套和跳出嵌套代碼片段:
//解析嵌套字段 Map<String, Aggregation> brandInfo =((Nested) result.get("brandInfo")).getAggregations().getAsMap(); //品牌 List<Terms.Bucket> bucketList = ((Terms) brandInfo.get("brands")).getBuckets(); for (Terms.Bucket bucket : bucketList) { //跳出嵌套 Map<String, Aggregation> revInfo =((ReverseNested) bucket.getAggregations().get("rev")).getAggregations().getAsMap(); //一級維度 List<Terms.Bucket> genders = ((Terms) revInfo.get("gender")).getBuckets(); //封裝數據 for (Terms.Bucket gender : genders) { //TODO } }