springboot整合es实现聚合搜索(根据请求的json体)

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就可以。

猜你喜欢

转载自blog.csdn.net/weixin_46269980/article/details/106078335