如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)

下面来说明一下如何用IDEA构建查询构建器,然后添加聚合

思路大概是这样的,先去构建查询构建器,然后添加聚合,把你的这个聚合的名称和要聚合的字段名加进去。聚合的名称比较容易理解,字段名有什么作用,就是你加进去后,搜索结果会把所有包含这个字段的商品结果集合成一体并且反馈这个商品的数量是多少等信息。

在Kibana里面我们用size=0来移除数据结果集,但是我们在IDEA就不能用size了,我们只能用结果集过滤的方法来达到size的效果,传入要移除的字段包括哪些(new String【】{}是一个空集合,在这里表示全部字段,也就是移除全部字段的意思),移除的字段不包括哪些(excludes=null代表全部移除)
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
接下来我们就是要执行聚合查询了,可以看到我们用上面已经封装好的itemRepository方法来执行查询,并把刚刚的queryBuilder参数传进去(queryBuilder在上面已经接收了聚合名,字段,还有结果过滤),凡是把查询构建器传进去Repository方法里面的话,都是需要queryBuilder.build()一下。
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
这时就有个问题来了,上图的Page<Item>可以获取下图中的这个aggregations吗(也就是聚合结果集的名字,我们执行查询聚合结果的时候,一般会返回一个数据结果集和聚合结果集)
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
我们可以来看看它的方法,它只是一个Page接口方法,里面并没有能够直接获取到aggregations聚合的方法。那该怎么办呢?
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
所以我们要调用Page里面的一个子接口,有个获取聚合的Page接口
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
回来我们的测试类,我们需要对这个方法做一个转换
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
把右边的结果进行强制转换成AggregatedPage并且传入Item这个实体类的泛型,然后左边也同样把返回值改为AggregatedPage<Item>
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
执行了聚合查询操作后,我们还需要对查询到的结果集进行解析,下图中圈出来的地方就是我们上面讲到的通过传入聚合名,然后获取聚合的方法,我们这里传入聚合名获取了聚合,返回一个聚合结果集。
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
我们上面的操作就是获取了下面的这一个信息了,下面的是一个聚合结果集结果例子,然而我们看看下面还有一个buckets还没有去获取,什么是buckets呢?就是一个桶,包含一个商品大概有多少个结果这样的信息,我们该如何去获取这个buckets呢?
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
可以看到在这个聚合方法里有获取多个桶的聚合方法,里面的参数有三种,一个是根据Long类型的字段获取,另外两个分别是根据String,Double类型的字段获取桶。
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
先看看下图,这是我们原来写的代码
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
我们可以看到改变的结果如下,为什么会变成这样呢?因为我们的聚合是一个词条类型,你可以在上面看到我们用term来接收聚合名,所以聚合是个词条类型,也就是为什么用StringTerms中的Terms了,而且我们的这个聚合里面,字段是String类型,字段就是brand,它是一个String类型,综合起来我们就要做一个强制转换,把结果集转换为StringTerms类型并且返回StringTerms

然后我们再用list去接收这个桶,Bucket是一个桶方法,brandAgg.getBuckets是获取桶的方法
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
我们需要用到这个遍历方法,为什么要用这个遍历方法呢?因为我们的桶是一个集合,有多个桶(虽然这里只有一个桶,但是实际查询中可能有多个桶),我们需要在每一个桶中加入关键词key和数量多少DocCount,所以需要用到遍历的方法(下面为什么用getKeyAsString而不用getKey,因为我们已经知道了获取的关键词是什么类型,是String类型,所以可以直接用getKeyAsString来获取关键词,用getKey的话还需要另外配置表明是String类型)
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
上图中获取的两个东西相当于获取下图中的这两个东西

如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
执行后的结果
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)
如果我们在一个聚合查询里面有子集那该怎么办呢?

首先上面这句话该怎么理解?

也就是说,我们在一个聚合里面,还想有一个聚合,这个聚合可以是求商品价格的平均数或者其他,那我们该如何在IDEA里面进行编写呢?

如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)

首先,我们要在当前聚合的方法里面加入子集合,也就是下面红线部分,我们这里是用avg方法,并且传入聚合名字price_avg,还有字段price
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)

在遍历方法里面加入Map集合,传入泛型String,Aggregation,为什么传入这两个呢?因为我们的关键词key也就是聚合名称price_avg是一个String类型,而字段也就是聚合对象是price,右边就是从桶里面获取这个子集合作为一个Map

InternalAvg那一行的方法是你要强制转换为平均数,先获取聚合名

最终输出值
如何在IDEA中使用聚合查询方法(排除数据结果集只获取聚合结果集,获取聚合结果,获取桶,如何添加聚合子集)