ElasticSearch Java High Level Client
封装类似SQL select * from xxx group by xxx.xxx order by xxx
的实现
可以通过top_hits实现
/**
* @return SearchSourceBuilder 是封装在SearchRequest里的,它里面就是ElasticSearch的查询条件
*/
public SearchSourceBuilder assemblySearchSourceBuilder(){
SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
//封装query的条件
QueryBuilder query = ....
//封装aggregation
AggregationBuilder aggregationBuilder = AggregationBuilders.terms(xxx).field(xxx);
//封装top_hits
TopHitsAggregationBuilder topHit = AggregationBuilders
.topHits(xxx)
//source(返回的字段,不包含的字段)
.source(xxx,xxx)
//可以多个排序条件,sort(排序字段名,排序规则ASC、DESC)
.sort(xxx,SortOrder);
//把top_hits封到外层的AggregationBuilder里
aggregationBuilder.subAggregation(topHit);
}
Aggregation 获取Data
public void assemblyAggregationData(SearchResponse response){
Aggregations aggregations = response.getAggregations();
//key是在aggregations查询时自己设置的(AggregationBuilders.terms(xxx))
Terms terms = aggregations.get(key);
List<Bucket> bucketList = terms.getBuckets();
for( Bucket b: bucketList ){
//获取的是aggregations查询时自己设置(AggregationBuilder.field(xxx))
//xxx对应的是ElasticSearch中存储的字段名称
//o是ElasticSearch中存储的字段对应的值
Object o = b.getKey();
}
}
获取Aggregation中Top_Hits中的数据
public void assemblyTopHitsData(SearchResponse response){
//包含上一部分的代码,这里省略
...
for( Bucket b: bucketList ){
//xxx是aggregations查询时自己设置top_hits的外层的aggregations的名称
ParsedTopHits hits = b.getAggregations().get(xxx);
for(SearchHit hit : hits){
//这里获取返回数据的json字符串
String jsonStr = hit.getSourceAsString();
//后面就是处理获取的json数据了
...
}
}