【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了,我这里直接是使用代码。

基础准备:

创建实体类:
@Data
// 索引名
@IndexName("test_jc")
public class TestJcES {// id注解@IndexId(type = IdType.CUSTOMIZE)private Long id;// 如果需要分词查询,必须  FieldType.TEXT  analyzer = "ik_max_word" 官网有说明@IndexField(fieldType = FieldType.TEXT,  analyzer = "ik_max_word")private String name;// 非分词查询类型 最好用 KEYWORD@IndexField(fieldType = FieldType.KEYWORD)private String sex;/*** [描述] 如果某字段数组类型,并且该类型后期需要聚合操作,必须 fieldData = true* FieldType.TEXT:会将数组中的元素 “拆分单字符” 进行聚合* FieldType.KEYWORD: 会对数组中的元素进行聚合*/@IndexField(fieldType = FieldType.TEXT,fieldData = true)private List<String> industryTags;@IndexField(fieldType = FieldType.KEYWORD,fieldData = true)private List<String> productTags;//时间类型@IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss")private String updateTime;@IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss")private String createTime;public TestJcES(Long id,String name, List<String> industryTags, List<String> productTags) {this.id = id;this.name = name;this.industryTags = industryTags;this.productTags = productTags;}
}
PS:在easy-es的注解 @IndexFiled 中源码会有说明:

在这里插入图片描述

对应的mapper:
// BaseEsMapper  来自 easy-es框架
public interface TestJcESMapper extends cn.easyes.core.core.BaseEsMapper<TestJcES> {
}

增删改(带批量):

		testJcESMapper.deleteIndex("test_jd");testJcESMapper.createIndex("test_jd");TestJcES es = new TestJcES(1L,"小红",29,Arrays.asList("分类1","分类2","分类3"),Arrays.asList("标签1","标签2"));TestJcES es2 = new TestJcES(2L,"小白",29,Arrays.asList("分类1","分类3"),Arrays.asList("标签1","标签3"));TestJcES es3 = new TestJcES(3L,"小黑",30,Arrays.asList("分类4"),Arrays.asList("标签1"));TestJcES es4 = new TestJcES(4L,"小明",18,Arrays.asList("分类1"),Arrays.asList("标签1","标签2","变迁3"));testJcESMapper.insertBatch(Arrays.asList(es,es2,es3,es4));//批量更新//testJcESMapper.updateBatchByIds(Arrays.asList(es,es2,es3,es4));//批量删除//testJcESMapper.deleteBatchIds(Arrays.asList(1L,2L, 3L, 4L));LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();//相当于 select * from test_jc where name like '%红%' and sex = 29 and industryTags in ('标签1','标签2')query.and(item->item.match(TestJcES::getName, "红"));query.and(item->item.match(TestJcES::getSex, 29));query.in("industryTags",Arrays.asList("标签1","标签2"));// 默认按查询度倒叙lambdaEsQueryWrapper.sortByScore(SortOrder.DESC);//注意:从1开始起步 不是从0开始EsPageInfo<TestJcES> pageQuery = testJcESMapper.pageQuery(query, 1, 10);//查询数据System.out.println(pageQuery.getList());//总条数System.out.println(pageQuery.getTotal());//总页数System.out.println(pageQuery.getPages());

聚合操作:

1.普通keyword类型字段聚合:
        LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();//TODO 这里也可以通过query带条件进行聚合//比如: query.match(TestJcES::getName, "红");// 这里类似 select * from test_jc group by sex String filedName = "sex";query.groupBy(filedName);// 是否统计hits的数据总数 设置为0 则不统计 数据量大的时候聚合速度会更快一些//query.size(0);SearchResponse searchResponse = testJcESMapper.search(query);//7. 获取命中对象 SearchHitsSearchHits hits = searchResponse.getHits();//7.1 获取总记录数 如果 query.size(0) 则这里值就为0Long total= hits.getTotalHits().value;System.out.println("被聚合的数据总条数:"+total);// aggregations 对象Aggregations aggregations = searchResponse.getAggregations();//将aggregations 转化为mapMap<String, Aggregation> aggregationMap = aggregations.asMap();//通过key获取 filedName+"Terms" 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现//        Aggregation goods_brands1 = aggregationMap.get(filedName+"Terms");Terms resultTerms =(Terms) aggregationMap.get(filedName+"Terms");//获取buckets 数组集合List<? extends Terms.Bucket> buckets = resultTerms.getBuckets();Map<String,Object>map=new HashMap<>();//遍历buckets   key 属性名,doc_count 统计聚合数for (Terms.Bucket bucket : buckets) {System.out.println(bucket.getKey());System.out.println(bucket.getDocCount());map.put(bucket.getKeyAsString(),bucket.getDocCount());}

聚合效果:
在这里插入图片描述

2.数组(text类型)类型聚合:
LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();//TODO 这里也可以通过query带条件进行聚合//比如: query.match(TestJcES::getName, "红");String filedName = "industryTags";query.groupBy(filedName);// 是否统计hits的数据总数 设置为0 则不统计 数据量大的时候聚合速度会更快一些//query.size(0);SearchResponse searchResponse = testJcESMapper.search(query);//7. 获取命中对象 SearchHitsSearchHits hits = searchResponse.getHits();//7.1 获取总记录数 如果 query.size(0) 则这里值就为0Long total= hits.getTotalHits().value;System.out.println("被聚合的数据总条数:"+total);// aggregations 对象Aggregations aggregations = searchResponse.getAggregations();//将aggregations 转化为mapMap<String, Aggregation> aggregationMap = aggregations.asMap();//通过key获取 filedName+"Terms" 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现//        Aggregation goods_brands1 = aggregationMap.get(filedName+"Terms");Terms resultTerms =(Terms) aggregationMap.get(filedName+"Terms");//获取buckets 数组集合List<? extends Terms.Bucket> buckets = resultTerms.getBuckets();Map<String,Object>map=new HashMap<>();//遍历buckets   key 属性名,doc_count 统计聚合数for (Terms.Bucket bucket : buckets) {System.out.println(bucket.getKey());System.out.println(bucket.getDocCount());map.put(bucket.getKeyAsString(),bucket.getDocCount());}

如果实体类的属性类型采用 text,则会把该属性里面的所有值分词然后进行聚合:
在这里插入图片描述
聚合效果:
在这里插入图片描述

2.数组(keyword类型)类型聚合:
        LambdaEsQueryWrapper<TestJcES> query = new LambdaEsQueryWrapper<>();//TODO 这里也可以通过query带条件进行聚合//比如: query.match(TestJcES::getName, "红");// 类似  select * from test_jc group by productTagsString filedName = "productTags";query.groupBy(filedName);// 是否统计hits的数据总数 设置为0 则不统计 数据量大的时候聚合速度会更快一些//query.size(0);SearchResponse searchResponse = testJcESMapper.search(query);//7. 获取命中对象 SearchHitsSearchHits hits = searchResponse.getHits();//7.1 获取总记录数 如果 query.size(0) 则这里值就为0Long total= hits.getTotalHits().value;System.out.println("被聚合的数据总条数:"+total);// aggregations 对象Aggregations aggregations = searchResponse.getAggregations();//将aggregations 转化为mapMap<String, Aggregation> aggregationMap = aggregations.asMap();//通过key获取 filedName+"Terms" 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现//        Aggregation goods_brands1 = aggregationMap.get(filedName+"Terms");Terms resultTerms =(Terms) aggregationMap.get(filedName+"Terms");//获取buckets 数组集合List<? extends Terms.Bucket> buckets = resultTerms.getBuckets();Map<String,Object>map=new HashMap<>();//遍历buckets   key 属性名,doc_count 统计聚合数for (Terms.Bucket bucket : buckets) {System.out.println(bucket.getKey());System.out.println(bucket.getDocCount());map.put(bucket.getKeyAsString(),bucket.getDocCount());}

聚合效果:
es聚合强大的地方在于,会把属性为数组拆分元素进行聚合统计,一般来说,普通统计用到这里就完全足够了。
在这里插入图片描述

PS 另外附赠elasticsearch通用聚合方法:

    /*** [描述]*/private List<Map<String,Object>> commonGroup3(TestJcES search , String fieldName) {// 创建一个布尔查询来组合多个条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();if (StringUtils.isNotBlank(search.getName())) {boolQuery.should(QueryBuilders.multiMatchQuery(search.getName(), "name"));}if(search.getProductTags() != null){boolQuery.should(QueryBuilders.matchQuery("productTags",search.getProductTags()));}return commonGroupByBoolQuery(fieldName, boolQuery,"test_jc");}/*** 根据布尔查询创建一个过滤聚合,并返回基于指定字段的聚合结果* @param fieldName 指定的字段名* @param boolQuery 基于该布尔查询创建过滤聚合* @param indexName 索引名称* @return 基于指定字段的聚合结果列表,每个结果包含字段名和计数*/private List<Map<String, Object>> commonGroupByBoolQuery(String fieldName, BoolQueryBuilder boolQuery,String indexName) {// 创建一个过滤聚合,基于布尔查询FilterAggregationBuilder filterAgg = AggregationBuilders.filter("filtered_agg", boolQuery);// 在过滤后的文档上创建其他聚合TermsAggregationBuilder termsAgg = AggregationBuilders.terms("agg_field").field(fieldName);// 将聚合添加到过滤聚合中filterAgg.subAggregation(termsAgg);SearchRequest searchRequest = new SearchRequest(indexName);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加聚合到搜索源构建器sourceBuilder.aggregation(filterAgg);searchRequest.source(sourceBuilder);try {SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 获取聚合结果Filter filteredAggregation = searchResponse.getAggregations().get("filtered_agg");Terms yourFieldAggregation = filteredAggregation.getAggregations().get("agg_field");return yourFieldAggregation.getBuckets().stream().map(item -> {Map<String, Object> map = new HashMap<>(2);map.put("name", item.getKeyAsString());map.put("count", item.getDocCount());return map;}).collect(Collectors.toList());} catch (IOException e) {e.printStackTrace();}return List.of();}

另附easy-es官网地址:
https://www.easy-es.cn/pages/ce1922/#%E5%B8%B8%E8%A7%84%E8%81%9A%E5%90%88

部分es教程博客:
https://blog.csdn.net/weixin_46115287/article/details/120974337

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/292289.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费!Apipost IDEA插件

IDEA插件市场中的API调试插件不是收费&#xff08;Fast Request &#xff09;就是不好用&#xff08;apidoc、apidocx等等&#xff09;今天给大家介绍一款国产的API调试插件&#xff1a;Apipost-Helper&#xff0c;完全免费且好看好用&#xff01; 这款插件由Apipost团队开发的…

docker安装ES:7.8和Kibana:7.8

本文适用于centos7,快速入手练习es语法 前置&#xff1a;安装docker教程docker、docker-component安装-CSDN博客 1.安装es 9200为启动端口&#xff0c;9300为集群端口 docker pull elasticsearch:7.8.0mkdir -p /mydata/elasticsearch/pluginsmkdir -p /mydata/elasticsear…

IDEA 黑色主题很难看到鼠标

“控制面板”—搜索“鼠标”关键字—选择“更改鼠标设置” 参考&#xff1a; IDEA 黑色主题很难看到鼠标

编码器脉冲信号测量2路DI高速计数器PNP/NPN转RS-485数据采集模块 YL150-485 标准Modbus RTU协议

特点&#xff1a; ● 编码器解码转换成标准Modbus RTU协议 ● 可用作编码器计数器或者转速测量 ● 支持编码器计数&#xff0c;可识别正反转 ● 也可以设置作为2路独立DI高速计数器 ● 计数值支持断电自动保存 ● DI输入支持PNP和NPN输入 ● 继电器和机械开关输入时可以…

​​​​​​​配置MUX VLAN示例(接入层设备)

组网需求 在企业网络中&#xff0c;企业所有员工都可以访问企业的服务器。但对于企业来说&#xff0c;希望企业内部部分员工之间可以互相交流&#xff0c;而部分员工之间是隔离的&#xff0c;不能够互相访问。 如图1所示&#xff0c;为了解决上述问题&#xff0c;可在连接终端…

苏州耕耘无忧物联网:降本增效,设备维护管理数字化转型的引领者

随着科技的快速发展和工业4.0的推动&#xff0c;设备维护管理已经从传统的被动式、经验式维护&#xff0c;转向了更加积极主动、数据驱动的维护模式。在这个过程中&#xff0c;苏州耕耘无忧物联科技有限公司以其深厚的技术积累和丰富的管理经验&#xff0c;引领着设备维护管理数…

苹果如何从iCloud恢复备份?正确方法看这里!

iCloud为所有苹果用户免费提供5G内存空间&#xff0c;用户可以将照片、短信、联系人、备忘录等重要信息备份到iCloud云端&#xff0c;这样可以方便在不同设备之间同步和共享。 同时&#xff0c;iCloud保证这些数据在所有苹果设备上及时自动更新。当遇到手机数据丢失时&#xf…

SpringMVC:执行原理详解、配置文件和注解开发实现 SpringMVC

文章目录 SpringMVC - 01一、概述二、SpringMVC 执行原理三、使用配置文件实现 SpringMVC四、使用注解开发实现 SpringMVC1. 步骤2. 实现 五、总结注意&#xff1a; SpringMVC - 01 一、概述 SpringMVC 官方文档&#xff1a;点此进入 有关 MVC 架构模式的内容见之前的笔记&a…

安装stm32 ST-link utility完成后找不到mfc140.dll文件怎么处理

解决办法&#xff1a; Latest supported Visual C Redistributable downloads | Microsoft Learn 进入网站&#xff0c;下载安装完成即可

Leetcode—73.矩阵置零【中等】

2023每日刷题&#xff08;六十六&#xff09; Leetcode—73.矩阵置零 空间复杂度为O(mn)版实现代码 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int rowLen matrix.size();int colLen matrix[0].size();vector<int> row…

7-1 建立二叉搜索树并查找父结点(PTA - 数据结构)

按输入顺序建立二叉搜索树&#xff0c;并搜索某一结点&#xff0c;输出其父结点。 输入格式: 输入有三行&#xff1a; 第一行是n值&#xff0c;表示有n个结点&#xff1b; 第二行有n个整数&#xff0c;分别代表n个结点的数据值&#xff1b; 第三行是x&#xff0c;表示要搜索值…

NTP8835(30W+2X10W 2.1音箱专用D类功放IC)

数字音频技术的迅速发展&#xff0c;使功放IC在消费电子行业中极具潜力&#xff1b;数字功放芯片能够将数字信号转换成音频信号&#xff0c;从而使用户能够从各种外部设备和媒体中获得最佳的音质&#xff1b;在许多领域得到广泛应用&#xff0c;包括家庭影院、专业音响、电视机…