ES结合java代码聚合查询详细示例
作者:砖厂老干部 发布时间:2022-08-31 01:23:29
标签:java,es,聚合查询
思路不清晰的小伙伴可以先在es中把聚合代码写出来
{
"aggs": {
"brandAgg": {
"terms": {
"field": "brandName.keyword"
},
"aggs": {
"typeAgg": {
"terms": {
"field": "typeTwoName.keyword"
}
},
"ruleAgg": {
"terms": {
"field": "ruleName.keyword"
},
"aggs": {
"ruleValueAgg": {
"terms": {
"field": "ruleAttrValue.keyword"
}
}
}
}
}
}
}
注:字段名称加keyword是精准查询,模糊查询可以去掉
查询完成后这是聚合的结构
pom文件中引入依赖es依赖,在这里就不详细介绍了,首先在java中构建对象
//构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
在java代码中先把要聚合的名称创建出来
根据刚刚的es代码设置java中的terms名称和field后面的名称相对应
//构建聚合名称
TermsAggregationBuilder brandAgg = AggregationBuilders.terms("brandAgg").field("brandName.keyword");
TermsAggregationBuilder typeAgg = AggregationBuilders.terms("typeAgg").field("typeTwoName.keyword");
TermsAggregationBuilder ruleAgg = AggregationBuilders.terms("ruleAgg").field("ruleName.keyword");
TermsAggregationBuilder ruleValueAgg = AggregationBuilders.terms("ruleValueAgg").field("ruleAttrValue.keyword");
这里是根据es代码中创建的层级关系来依次分配
//根据聚合分配层级
brandAgg.subAggregation(typeAgg);
brandAgg.subAggregation(ruleAgg);
ruleAgg.subAggregation(ruleValueAgg);
//添加最外层聚合
searchSourceBuilder.aggregation(brandAgg);
创建实体类来接参
/*=====================聚合分析=====================*/
/**
* 查询到的所有商品所涉及的所有品牌
*/
private Set<BrandVO> brands = new HashSet<>();
/**
* 查询到的所有商品所涉及的所有分类
*/
private Set<TypeVO> types = new HashSet<>();
/**
* 查询到的所有商品所涉及的所有属性(规格)
*/
private Set<AttrVO> attrs = new HashSet<>();
@Data
public static class BrandVO {
private Long brandId;
private String brandName;
private String brandImg;
}
@Data
public static class TypeVO {
private Long TypeId;
private String TypeName;
}
@Data
public static class AttrVO {
private Long attrId;
private String attrName;
private List<String> attrValue;
}
@Data
public static class BreadCrumbsVO {
private String attrName;
private String attrValue;
private String link;
}
在方法中把参数先备好
//定义参数
Set<SearchResult.BrandVO> brandVOList = new HashSet<>();
Set<SearchResult.TypeVO> typeList = new HashSet<>();
Set<SearchResult.AttrVO> attrList = new HashSet<>();
首先获取最外层的参数
有一点需要更改的 回调参数是Aggregations需要改成Terms才能调取方法
//获取聚合参数
Aggregations brandAggregations = response.getAggregations();
//获取品牌
Terms brandGations = brandAggregations.get("brandAgg");
循环获取参数添加到指定的集合当中,这个获取的就相当于是es当中key的值
for (Terms.Bucket bucket : brandGations.getBuckets()) {
//添加品牌
SearchResult.BrandVO brandVO = new SearchResult.BrandVO();
brandVO.setBrandName(bucket.getKeyAsString());
brandVOList.add(brandVO);
}
因为我最外层只有一个分组,所以在循环中继续获取数据
这个bucket就相当于es当中获取下一层级因为我设定的brand和type都是一个层的所以都使用bucket来获取参数
get的变量就是相当于es中设置的名称然后我们拿到下面的key的值加入到我们的集合当中
注意一下这是基于上一层for循环中嵌套的
//获取类型
Aggregations aggregations = bucket.getAggregations();
Terms typeGations = aggregations.get("typeAgg");
//添加类型
for (Terms.Bucket typeGationsBucket : typeGations.getBuckets()) {
SearchResult.TypeVO typeVO = new SearchResult.TypeVO();
typeVO.setTypeName(typeGationsBucket.getKeyAsString());
typeList.add(typeVO);
}
接下来就简单了,根据es当中设定好的层级关系一级一级的获取后在添加到我们设定好的集合当中
把其他的层级都一步一步获取出来
//获取spu
Terms ruleGations = aggregations.get("ruleAgg");
//添加spu
for (Terms.Bucket ruleGationsBucket : ruleGations.getBuckets()) {
SearchResult.AttrVO attrVO = new SearchResult.AttrVO();
attrVO.setAttrName(ruleGationsBucket.getKeyAsString());
//获取sku
Aggregations attrValueAggregations = ruleGationsBucket.getAggregations();
Terms ruleValueGations = attrValueAggregations.get("ruleValueAgg");
//添加sku
for (Terms.Bucket ruleValueGationsBucket : ruleValueGations.getBuckets()) {
ArrayList<String> attrValueList = new ArrayList<>();
for (String attrValue : ruleValueGationsBucket.getKeyAsString().split(",")) {
attrValueList.add(attrValue);
}
attrVO.setAttrValue(attrValueList);
}
attrList.add(attrVO);
}
最后在添加到实体类的对象当中
//添加对象中数据
result.getProductInfoList().addAll(productInfoList);
result.getBrands().addAll(brandVOList);
result.getAttrs().addAll(attrList);
result.getTypes().addAll(typeList);
最后查询,就获取到了我们聚合后的值了,在根据业务进行下一步的操作
最后展示一下所有的代码
SearchResult result = new SearchResult();
try {
//构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//构建聚合名称
TermsAggregationBuilder brandAgg = AggregationBuilders.terms("brandAgg").field("brandName.keyword");
TermsAggregationBuilder typeAgg = AggregationBuilders.terms("typeAgg").field("typeTwoName.keyword");
TermsAggregationBuilder ruleAgg = AggregationBuilders.terms("ruleAgg").field("ruleName.keyword");
TermsAggregationBuilder ruleValueAgg = AggregationBuilders.terms("ruleValueAgg").field("ruleAttrValue.keyword");
//根据聚合分配层级
brandAgg.subAggregation(typeAgg);
brandAgg.subAggregation(ruleAgg);
ruleAgg.subAggregation(ruleValueAgg);
//添加最外层聚合
searchSourceBuilder.aggregation(brandAgg);
//定义参数
Set<SearchResult.BrandVO> brandVOList = new HashSet<>();
Set<SearchResult.TypeVO> typeList = new HashSet<>();
Set<SearchResult.AttrVO> attrList = new HashSet<>();
//获取聚合参数
Aggregations brandAggregations = response.getAggregations();
//获取品牌
Terms brandGations = brandAggregations.get("brandAgg");
for (Terms.Bucket bucket : brandGations.getBuckets()) {
//添加品牌
SearchResult.BrandVO brandVO = new SearchResult.BrandVO();
brandVO.setBrandName(bucket.getKeyAsString());
brandVOList.add(brandVO);
//获取类型
Aggregations aggregations = bucket.getAggregations();
Terms typeGations = aggregations.get("typeAgg");
//添加类型
for (Terms.Bucket typeGationsBucket : typeGations.getBuckets()) {
SearchResult.TypeVO typeVO = new SearchResult.TypeVO();
typeVO.setTypeName(typeGationsBucket.getKeyAsString());
typeList.add(typeVO);
}
//获取spu
Terms ruleGations = aggregations.get("ruleAgg");
//添加spu
for (Terms.Bucket ruleGationsBucket : ruleGations.getBuckets()) {
SearchResult.AttrVO attrVO = new SearchResult.AttrVO();
attrVO.setAttrName(ruleGationsBucket.getKeyAsString());
//获取sku
Aggregations attrValueAggregations = ruleGationsBucket.getAggregations();
Terms ruleValueGations = attrValueAggregations.get("ruleValueAgg");
//添加sku
for (Terms.Bucket ruleValueGationsBucket : ruleValueGations.getBuckets()) {
ArrayList<String> attrValueList = new ArrayList<>();
for (String attrValue : ruleValueGationsBucket.getKeyAsString().split(",")) {
attrValueList.add(attrValue);
}
attrVO.setAttrValue(attrValueList);
}
attrList.add(attrVO);
}
}
//添加对象中数据
result.getProductInfoList().addAll(productInfoList);
result.getBrands().addAll(brandVOList);
result.getAttrs().addAll(attrList);
result.getTypes().addAll(typeList);
}
}catch (Exception ex){
log.error("检索ES失败: {}", ex);
}
来源:https://blog.csdn.net/qq_34160849/article/details/128120124


猜你喜欢
- SpringBoot 集成 activiti 基础环境搭建添加依赖<dependency> <groupId&g
- 如果一个项目内有很多个界面,那么在layout下会有太多的activity***.xml文件,这个时候就需要使用文件夹对这些分别存放了。当然
- 本文实例为大家分享了Android实现Window弹窗效果的具体代码,供大家参考,具体内容如下效果图第一步 准备弹窗的布局,新建XML文件
- 权限提升方法:一种方法:1、在AndroidManifest.xml中的manifest节点中添加android:sharedUserId=
- 引言在实际的Android项目开发中,图片是必不可少的元素,几乎所有的界面都是由图片构成的;像列表页、查看大图页等,都是需要展示图片,而且这
- 本文使用Matrix实现Android实现图片缩放与旋转。示例代码如下:package com.android.matrix;import
- 栈栈(stack)又名堆栈,它是一种运算受限的线性表 。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
- springboot启动时自动加载application.properties或者application.yml,如何定义自己的配置让spr
- 它可以做什么?它做的事情当然是生成新类或修改原始的类,比如你遇到这样的情况下就可以使用:反射好慢,曾见过一个大厂大量是Gson,由于Gson
- 我们日常的工作中都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通过打包工具把项目打包成 j
- 作为Android的四大组件之一,ContentProvider作为进程之间静态数据传递的重要手段,其在系统级别的应用中起了重大的作用。毫无
- 一棵二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构表示,其中每一个结点都是一个对象。结点中除了数据外,还包括域left,right
- Random类介绍Random类一个用于产生 伪随机 数字的类。这里的伪随机表示有随机性但是可以基于算法模拟出随机规律。Random类的构造
- 本文为大家介绍了java图片添加水印实例代码,java实现水印还是非常方便的,水印可以是图片或者文字,具体内容如下package micha
- 1 需求Mybatis-plus使用@TableLogic注解进行逻辑删除数据后,在某些场景下,又需要查询该数据时,又不想写SQ
- 简介 相信很多人都接触spring框架很长时间了,每次搭建spring框架的时候都需要配置好多的jar、xml,做很多繁琐重复的配置,稍微不
- NPOI 2.0将DataTable对象转换为Excel 2007文件提供下载using NPOI.SS.UserModel;using N
- 本文实例为大家分享了Android实现层叠卡片式banner的具体代码,供大家参考,具体内容如下效果图如下:背景由于公司VIP模块项目需要,
- ps:我用的版本是7.0.5场景:左侧第一列宽度不够,导致数据换行。Table table = new Table(new float[2]
- 前言Kafka是现在非常热门的分布式消息队列,常用于微服务间异步通信,业务解耦等场景。kafka的性能非常强大,但是单个微服务吞吐性能是有上