【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
官网很完整的demo:
https://www.easy-es.cn/pages/17ea0a/#%E4%BC%98%E5%8A%BF%E5%AF%B9%E6%AF%94

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

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

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

相关文章

云上安全责任共担模型

对于传统自建物理服务器模式&#xff0c;用户需要承担所有的安全责任&#xff0c;负责从物理基础设施到上层应用的所有层面的安全体系构建。 云服务器的安全责任确实与物理服务器不同&#xff0c;云上的安全性是一种责任共担模式&#xff0c;其中云服务器ECS的安全责任需要你&…

关于“Python”的核心知识点整理大全39

目录 ​编辑 14.1.5 将 Play 按钮切换到非活动状态 game_functions.py 14.1.6 隐藏光标 game_functions.py game_functions.py 14.2 提高等级 14.2.1 修改速度设置 settings.py settings.py settings.py game_functions.py 14.2.2 重置速度 game_functions.py 1…

uniapp智能工具助手(附送250套精选微信小程序源码)

前言 现在的微信小程序非常火爆&#xff0c;网上也有很多学习资源&#xff0c;但是源码资源还是很少的。其实在学习开发微信小程序的时候如果有源码可以供我们借鉴&#xff0c;学习效率也会成倍的增加。 搭建或者想要基于某个小程序框架做二次开发 这里已收集整理好, 类目涵盖…

【MATLAB】PSO粒子群优化LSTM(PSO_LSTM)的时间序列预测

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO粒子群优化LSTM&#xff08;PSO-LSTM&#xff09;是一种将粒子群优化算法&#xff08;PSO&#xff09;与长短期记忆神经网络&#xff08;LSTM&#xff09;相结合的混合模型。该算法通过…

【深度学习-目标检测】01 - R-CNN 论文学习与总结

论文地址&#xff1a;Rich feature hierarchies for accurate object detection and semantic segmentation 论文学习 摘要&#xff08;Abstract&#xff09; 对象检测性能的现状&#xff1a; 在PASCAL VOC数据集上测量的对象检测性能在过去几年已经达到了一个高点。最佳性能…

SQL server 数据库练习题及答案(练习3)

一、编程题 公司部门表 department 字段名称 数据类型 约束等 字段描述 id int 主键&#xff0c;自增 部门ID name varchar(32) 非空&#xff0c;唯一 部门名称 description varchar(1024) …

MR实战:分科汇总求月考平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建学生实体类5、创建科目平均分映射器类…

混合专家模型(MoE)2022-2023顶会顶刊论文合集,包含算法、系统、应用3大类

混合专家模型&#xff08;MoE&#xff09;是一种深度学习技术&#xff0c;它通过将多个模型&#xff08;这些模型被称为"专家"&#xff09;直接结合在一起&#xff0c;以加快模型训练的速度&#xff0c;获得更好的预测性能。这种模型设计策略在大模型中尤为重要&…

W5100S-EVB-Pico评估版介绍

文章目录 1 简介2 硬件资源2.1 硬件规格2.2 引脚定义2.3 工作条件 3 参考资料3.1 Datasheet3.2 原理图3.3 尺寸图&#xff08;单位&#xff1a;mm&#xff09;3.4 参考例程 4 硬件协议栈优势 1 简介 W5100S-EVB-Pico是一款基于树莓派RP2040和全硬件TCP/IP协议栈以太网芯片W5100…

Java经典框架之Spring MVC

Spring MVC Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring MVC 入门案例 2. 基…

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义&#xff0c;这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的&#xff0c;以及如何关联起来的。&#xff08;我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

博客摘录「 Apollo安装和基本使用」2023年11月27日

一、常见配置中心对比 Spring Cloud Config: https://github.com/spring-cloud/spring-cloud-configApollo: https://github.com/ctripcorp/apolloNacos: https://github.com/alibaba/nacos 对比项目/配置中心 spring cloud config apollo nacos(重点) 开源时间 2014.9 …

尺寸公差分析与尺寸链计算软件-DTAS3D到底能给我们带来哪些价值?

【技能】DTAS3D能给我们带来哪些价值&#xff1f; DTAS3D是一款高度集成的公差分析软件&#xff0c;旨在为产品开发团队提供准确的建议&#xff0c;从而放心地将设计发布给制造部门。下面是DTAS3D的关键价值和应用: 1.与三维CAD无缝集成: DTAS3D与三维CAD软件 (CATIA、NX、Cr…

scala学习七:集合

一、集合colletion Scala提供了一套很好的集合实现&#xff0c;提供了一些集合类型的抽象。 Scala 集合分为可变的和不可变的集合。 可变集合可以在适当的地方被更新或扩展。可以修改&#xff0c;添加&#xff0c;移除一个集合的元素。 而不可变集合类&#xff0c;永远不会改变…

【操作系统】探究进程奥秘:显示进程列表的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;Linux专栏&#xff1a;《探秘Linux | 操作系统解密》⏰诗赋清音&#xff1a;月悬苍穹泛清辉&#xff0c;梦随星河徜徉辉。情牵天际云千层&#xff0c;志立乘风意自飞。 ​ 目录 &a…

Go_defer详解

defer 1. 前言 defer语句用于延迟函数的调用&#xff0c;每次defer都会把一个函数压入栈中&#xff0c;函数返回前再把延迟的函数取出并执行。 为了方便描述&#xff0c;我们把创建defer的函数称为主函数&#xff0c;defer语句后面的函数称为延迟函数。 延迟函数可能有输入…

IDEA 2022.2 安装教程

1.下载2020.3版本IDEA 链接&#xff1a;https://pan.baidu.com/s/1IFK8VRjT7vM2VM75ToveGQ?pwd176m 提取码&#xff1a;176m 2.安装 下载完成后&#xff0c;双击exe安装包&#xff0c;出现IDEA安装欢迎首页&#xff1a; 3.将 ja - netfiltet 文件复制到idea安装目录附件 …

Docker部署Nexus Maven私服并实现远程访问Nexus界面

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定N…

【ONE·MySQL || 基础介绍】

总言 主要内容&#xff1a;MySQL在Centos 7下的安装&#xff08;主要学习相关指令语句&#xff0c;理解安装操作是在做什么&#xff09;、对MySQL数据库有一个基础认识。 文章目录 总言0、MySQL的安装与卸载&#xff08;Centos 7&#xff09;0.1、MySQL的卸载0.1.1、卸载不必要…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…