1.准备好请求的请求体json串
{
"aggs": {
"group": {
"terms": {
"field": "productCategory.keyword"
},
"aggs": {
"sum": {
"sum": {
"field": "productPrice"
}
}
}
}
}
}
2.依赖见上一篇文章
略略略略
3.api(也可能会出异常)
String query = "{\"aggs\":{\"group\":{\"terms\":{\"field\":\"productCategory.keyword\"},\"aggs\":{\"sum\":{\"sum\":{\"field\":\"productPrice\"}}}}}}";
TransportClient client1 = new PreBuiltTransportClient(Settings.EMPTY);
client1.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("xxxxxx", 9300)));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
SearchModule module = new SearchModule(Settings.EMPTY, false, new ArrayList<SearchPlugin>());
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(
new NamedXContentRegistry(module.getNamedXContents()), query);
sourceBuilder.parseXContent(new QueryParseContext(parser));
SearchRequestBuilder requestBuilder = new SearchRequestBuilder(client1, SearchAction.INSTANCE);
SearchResponse response = requestBuilder.setSource(sourceBuilder).setIndices("emindex")
.setSize(10).execute().actionGet();
Terms terms = response.getAggregations().get("group");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
Map<String, Long> map = new HashMap<>();
for (Terms.Bucket b : buckets) {
InternalSum sum = b.getAggregations().get("sum");
map.put(b.getKeyAsString(), (long) sum.getValue());
}
return map;
这个es的搜索语句和上一篇文章的一样。
3.1QueryBuilders.wrapperQuery(query)
client1.prepareSearch("emindex").setQuery(QueryBuilders.wrapperQuery(query)).execute().actionGet();
这个api也可以使用json体搜索,但是有的搜索会报错,如下
org.elasticsearch.common.ParsingException: no [query] registered for [aggs]
意思是说没有[aggs]
这种query被注册,但是在es里有这种query,有的同学说你这个聚合的query名是简写,你应该写成aggregation
或者aggregations
,但是我试过了都不行。
原因
这是espackage org.elasticsearch.search;
下的query方法的源码,在这个类SearchModule
下。
里面已经注册了一些常用的query方法,但是没有聚合。
因此,
第三部分的api就是对这种方法的重写,相当于在
SearchModule
中注册了[aggs]
query
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(
new NamedXContentRegistry(module.getNamedXContents()), query);
4.结果
5.异常
这个异常,在json体里productCategory
后加上.keyword
就可以。