【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.mzph.cn/news/579425.shtml

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

相关文章

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(一)登录认证

一、JWT简介 JWT 全称 JSON Web Token&#xff0c;JWT 主要用于用户登录鉴权&#xff0c;当用户登录之后&#xff0c;返回给前端一个Token&#xff0c;之后用户利用Token进行信息交互。 除了JWT认证之外&#xff0c;比较传统的还有Session认证&#xff0c;如何选择可以查看之前…

Spring中常见的BeanFactory后处理器

常见的BeanFacatory后处理器 先给出没有添加任何BeanFactory后处理器的测试代码 public class TestBeanFactoryPostProcessor {public static void main(String[] args) {GenericApplicationContext context new GenericApplicationContext();context.registerBean("co…

JAVA复习三——CH5 Java Collection 、CH6 MultiThread

CH5 Java Collection(集合) 5.1 Java集合框架&#xff08;位于java.util包中&#xff09; 图一 集合框架图 从上面的集合框架图可以看到&#xff0c;Java 集合框架主要包括两种类型的容器&#xff0c;一种是集合&#xff08;Collection&#xff09;&#xff0c;存储一个元素集…

信息犯罪与计算机取证

1.信息安全 信息安全的三种定义p2 ISO的 为数据处理系统建立和采取的技术和管理的安全保护&#xff0c;保护计算机硬件&#xff0c;软件数据不因偶尔或恶意的原因而受到破坏&#xff0c;更改和泄露 欧盟的 在既定的密级条件下&#xff0c;网络与信息系统抵御意外或恶意行为的能…

【C++】const 关键字

想要正确理解const关键字&#xff0c;只需记住一句话&#xff1a; cosnt关键字优先修饰左边&#xff0c;如果左边每东西&#xff0c;就作用于右边。 const int a; 修饰int a 不能改变 const int *a ; int const *a; 修饰int 指针a指向的地址可以改变&#xff0c;但是地址中…

flask文件夹列表改进版--Bug追踪

把当前文件夹下的所有文件夹和文件列出来&#xff0c;允许点击返回上层目录&#xff0c;允许点击文件夹进入下级目录并显示此文件夹内容 允许点击文件进行下载 from flask import Flask, render_template, send_file, request, redirect, url_for import osapp Flask(__name_…

抖店只能做和营业执照对照的产品吗?开店基础教程,新手可收藏!

我是王路飞。 抖店的营业执照有多重要呢&#xff1f;关系到你店铺的类型、类目和产品。 尤其是适合新手做的个体店&#xff0c;不涉及对公账户&#xff0c;货款可以直接提现到你的私人银行卡里&#xff0c;保证金也只有企业店铺的一半。 &#xff08;只需要身份证就能开通的…

深入Apache Commons Config:管理和使用配置文件

第1章&#xff1a;引言 咱们都知道&#xff0c;在软件开发中&#xff0c;管理配置文件是一件既重要又让人头疼的事。想象一下&#xff0c;咱们的应用程序有一堆设置需要调整&#xff0c;比如数据库的连接信息、应用的端口号&#xff0c;或者是一些功能的开关。如果这些信息硬编…

uni-app 命令行创建

1. 首先创建项目&#xff0c;命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错&#xff0c;如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法&#xff1a; 创建目录 C:\Users\Administrator\AppData\Roaming\n…

基于nodemailer实现邮件发送、附件发送、多人发送

文章目录 1、QQ邮箱如何设置授权码2、具体代码 1、QQ邮箱如何设置授权码 QQ邮箱SMTP/IMAP服务 1、点击账号与安全 2、安全设置 3、设备管理&#xff0c;可以查看有多少个授权码 2、具体代码 from 这个参数&#xff0c;有两种写法 qq号qq.com"姓名"<qq号qq.co…

UDP Ping程序实现--第5关:客户端向服务器发送消息并接收消息

✨创作不易&#xff0c;还希望各位大佬支持一下 &#x1f44d; 点赞&#xff0c;你的认可是我创作的动力&#xff01; ⭐️ 收藏&#xff0c;你的青睐是我努力的方向&#xff01; ✏️ 评论&#xff0c;你的意见是我进步的财富&#xff01; 任务描述 本关任务&#xff1a;P…

【数据库系统概论】第3章-关系数据库标准语言SQL(2)

文章目录 3.4 数据查询3.4.1 单表查询3.4.2 连接查询3.4.3嵌套查询3.4.4 集合查询3.4.5 基于派生表的查询3.4.6 select 语句的目标列 3.4 数据查询 格式 SQL执行顺序 3.4.1 单表查询 基础查询 select * from student // 不重复 select distinct sname from student // 命名…

C++ Lambda表达式的完整介绍

c在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数&#xff0c;使得代码更加灵活简洁。lambda表达式与普通函数类似&#xff0c;也有参数列表、返回值类型和函数体&#xff0c;只是它的定义方式更简洁&#xff0c;并且可以在函数内部定义。 什么是Lambda表达式…

【番外】在Windows安装Airsim/UE4踩坑合集

在Windows安装Airsim/UE4踩坑合集 1.安装过程中一定要确保Epic Games Launcher是英文环境&#xff0c;保存路径什么的也尽量是英文。2.UE4中的虚幻引擎一定要安装4.27版本以上的&#xff0c;不然的话最后运行vs的时候会报语法错误&#xff0c;网上根本查不到的那种错误。换了版…

谷歌被曝或再次大裁员!3万员工面临被AI取代

据报道&#xff0c;继1.2万大裁员之后&#xff0c;谷歌又计划重组广告销售部门——这将导致3万名员工面临裁员的风险。 这一年的科技行业&#xff0c;可以说是从年头裁到了年尾&#xff0c;还越裁越多了。 而这次谷歌的部门重组计划&#xff0c;让打工人们发现&#xff0c;除…

【Vulnhub 靶场】【Funbox: Scriptkiddie】【非常简单】【20210720】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/funbox-scriptkiddie,725/ 靶场下载&#xff1a;https://download.vulnhub.com/funbox/Funbox11.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月20日 文件大小&#xff1a;1.3 GB 靶场作者&…

盘古信息IMS-MOM制造运营管理系统,构建生产现场管理信息系统的最佳选择

在当今高度竞争的制造行业中&#xff0c;高效的生产管理是企业成功的关键。盘古信息IMS-MOM制造运营管理系统作为一款领先的管理系统其关键特性为制造企业构建生产现场管理信息系统提供了强大的优势。IMS-MOM不仅仅是一个软件系统&#xff0c;更是一种技术和管理手段的结合&…

【Kafka】Kafka客户端认证失败:Cluster authorization failed.

背景 kafka客户端是公司内部基于spring-kafka封装的spring-boot版本&#xff1a;3.xspring-kafka版本&#xff1a;2.1.11.RELEASE集群认证方式&#xff1a;SASL_PLAINTEXT/SCRAM-SHA-512经过多年的经验&#xff0c;以及实际验证&#xff0c;配置是没问题的&#xff0c;但是业务…

Java-Maven3.9.6:Maven依赖管理 / 安装-配置-使用

一、理解Maven Maven是一个开源的项目管理工具&#xff0c;主要用于构建和管理Java项目、依赖管理和文档生成&#xff0c;它可以自动下载所需的依赖库&#xff0c;并自动构建整个项目。理解Maven需要了解以下几个方面&#xff1a; 1. 项目对象模型&#xff08;Project Object…

7.2 uvm_resource_db in UVM

uvm_resource_db是一个类型参数化 type-parameterized的类&#xff0c;它是资源数据库顶部的一个方便层(convenience layer)。这个便利层简化了对低级数据库的访问&#xff0c;并且没有添加新功能。因此&#xff0c;uvm_resource_db不是从uvm_resource类派生的。以下uvm_resour…