【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. 获取命中对象 SearchHits
        SearchHits hits = searchResponse.getHits();
        //7.1 获取总记录数 如果 query.size(0) 则这里值就为0
        Long total= hits.getTotalHits().value;
        System.out.println("被聚合的数据总条数:"+total);
        // aggregations 对象
        Aggregations aggregations = searchResponse.getAggregations();
        //将aggregations 转化为map
        Map<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. 获取命中对象 SearchHits
        SearchHits hits = searchResponse.getHits();
        //7.1 获取总记录数 如果 query.size(0) 则这里值就为0
        Long total= hits.getTotalHits().value;
        System.out.println("被聚合的数据总条数:"+total);
        // aggregations 对象
        Aggregations aggregations = searchResponse.getAggregations();
        //将aggregations 转化为map
        Map<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 productTags
        String filedName = "productTags";
        query.groupBy(filedName);
        // 是否统计hits的数据总数 设置为0 则不统计 数据量大的时候聚合速度会更快一些
        //query.size(0);
        SearchResponse searchResponse = testJcESMapper.search(query);
        //7. 获取命中对象 SearchHits
        SearchHits hits = searchResponse.getHits();
        //7.1 获取总记录数 如果 query.size(0) 则这里值就为0
        Long total= hits.getTotalHits().value;
        System.out.println("被聚合的数据总条数:"+total);
        // aggregations 对象
        Aggregations aggregations = searchResponse.getAggregations();
        //将aggregations 转化为map
        Map<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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordpress主题modown v8.81+erphpdown v16.0无限制无授权开心版

修复bug&#xff08;v8.81 2023.03.07&#xff09; 新增文章页正文下面常见问题手风琴模块&#xff0c;可设置显示文章的更新日期而不是发布日期&#xff0c;首页幻灯片支持指定文章、支持一个大图4个小图显示&#xff0c;grid网格列表支持显示简介&#xff0c;前台个人中心里显…

mask rcnn训练基于labelme生成的数据集

1.下载mask rcnn源码 此处使用的mask rcnn源码来自于B站博主霹雳吧啦Wz 2.安装labelme sudo apt install python3-pyqt5 pip install labelme如果运行出现QT的错误&#xff0c;可能是与我一样遇到自己装了C版本的QT 解决&#xff1a;运行命令 unset LD_LIBRARY_PATH2.使用lab…

Find My帐篷|苹果Find My技术与帐篷结合,智能防丢,全球定位

帐篷是撑在地上遮蔽风雨﹑日光并供临时居住的棚子。多用帆布做成&#xff0c;连同支撑用的东西&#xff0c;可随时拆下转移。帐篷是以部件的方式携带&#xff0c;到达现场后才加以组装&#xff0c;所以&#xff0c;需要各种部件和工具。了解各个部件的名称和使用方法&#xff0…

图像ISP处理——自动对焦AF算法

自动对焦算法是在数码相机、摄像机和其他图像采集设备中常见的技术之一&#xff0c;它通过调整镜头位置或其他光学参数来确保拍摄的图像在焦点上清晰。 以下是一些常见的自动对焦算法&#xff1a; 对比度检测对焦&#xff08;Contrast Detection Autofocus&#xff0c;CDAF&am…

找到最佳优惠券组合!Java算法助力电商平台策略优化

大家好&#xff0c;我是小米&#xff0c;一个热爱分享技术的小伙伴。最近我们电商平台迎来了一个新的需求&#xff0c;需要在用户下单时&#xff0c;高效地计算出多张平台券和店铺券的最优组合&#xff0c;使用户享受到最大的优惠。为了满足这一需求&#xff0c;我研究了一下动…

通过宝塔面板部署一个SpringBoot+Vue前后端分离项目的指南(三更)

采取的部署方案 阿里云服务器->FinalShell->宝塔面板。 近期需要将自己的一个SpringBootVue前后端分离项目&#xff0c;并且是分模块开发的项目部署到服务器上&#xff0c;记录一下踩坑的地方&#xff0c;结合C站大佬的解决方案&#xff0c;循循善诱一步步部署到服务器上…

QQ群发邮件的技巧?QQ邮箱邮件群发怎么发?

QQ群发邮件怎么设置&#xff1f;QQ邮件群发必备利器有哪些&#xff1f; QQ群发邮件&#xff0c;作为当下最流行的通讯方式之一&#xff0c;已经被广大网友所熟知。但是&#xff0c;要想真正掌握QQ群发邮件的技巧&#xff0c;却不是一件容易的事情。下面&#xff0c;就让蜂邮ED…

CloudCanal x Debezium 打造实时数据流动新范式

简述 Debezium 是一个开源的数据订阅工具&#xff0c;主要功能为捕获数据库变更事件发送到 Kafka。 CloudCanal 近期实现了从 Kafka 消费 Debezium 格式数据&#xff0c;将其 同步到 StarRocks、Doris、Elasticsearch、MongoDB、ClickHouse 等 12 种数据库和数仓&#xff0c;…

【保姆级教程】使用Mediapipe进行Face Landmark Detection实践和Hand Landmark实践

目录 1 Mediapipe 2 Solutions 3 安装依赖库 4 实践 1 Mediapipe Mediapipe是google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning,ML)方案。MediaPipe是一个用于构建机器学习管道的框架,用于处理视频、音频等时间序列数据。与资源消耗型的机…

研究生课程 |《数值分析》复习

搭配往年真题册食用最佳。

美好蕴育润康:为孕产期女性量身定制的专业营养

如今&#xff0c;孕产期是女性人生中特别而又重要的阶段。这段时间&#xff0c;孕期妈妈经常饱受许多痛苦和不适&#xff0c;更需要额外的关爱和呵护&#xff0c;以确保母婴健康。为了满足孕产期女性特殊的营养需求&#xff0c;美好蕴育润康应运而生&#xff0c;成为她们身边的…

【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering

原文链接&#xff1a;https://arxiv.org/abs/2308.04079 1. 引言 网孔和点是最常见的3D场景表达&#xff0c;因其是显式的且适合基于GPU/CUDA的快速栅格化。神经辐射场&#xff08;NeRF&#xff09;则建立连续的场景表达便于优化&#xff0c;但渲染时的随机采样耗时且引入噪声…

Android13 Wifi启动流程分析

Android13 Wifi启动流程分析 文章目录 Android13 Wifi启动流程分析一、正常开关wifi 启动流程1、WifiManager2、WifiServiceImpl3、ActiveModeWarden4、ConcreteClientModeManager5、WifiNative6、WifiVendorHal7、HalDeviceManager8、wifi.cpp 二、重启设备时自动开启wifi流程…

结构型模式 | 适配器模式

一、适配器模式 1、原理 适配器模式&#xff08;Adapter&#xff09;&#xff0c;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类&#xff1a;类适配器模式、对象适配器模式、接口…

智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.冠状病毒群体免疫算法4.…

程序员的自我修养:链接、装载与库-3 目标文件里有什么

1 目标文件的格式 2 目标文件是什么样的 3 挖掘SimpleSection.o 3.1 代码段 3.2 数据段和只读数据段 3.3 BSS段 3.4 其他段 4 ELF文件结构描述 4.1 文件头 4.2 段表 4.3 重定位表 4.4 字符串表 5 链接的接口-符号 待补充 107

MySQL数据库 索引

目录 索引概述 索引结构 二叉树 B-Tree BTree Hash 索引分类 索引语法 慢查询日志 索引概述 索引 (index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种…

【银行测试】银行金融测试+金融项目测试点汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行金融测试是…

Pycharm报的一些Python语法错误

Pycharm报的一些Python语法错误 1、PEP8:Expected 2 blank less:found 1 意思是&#xff1a;类和上面的行要间隔两行&#xff0c;现在只有一行 解决办法&#xff1a; 间隔2行 2、Remove redundant parentheses 意思是&#xff1a;删除多余的括号 解决&#xff1a;删掉外面括…

两种经典的现货白银假突破类型

假突破是现货白银市场中一种具有反大众性的市场行为。它通常和一种强势的市场行为突破联系在一起&#xff0c;但是它的方向是和突破完全相反的&#xff0c;识别假突破的类型&#xff0c;有助于降低我们亏损的风险&#xff0c;那如何识别呢&#xff1f;下面我们来介绍两种假突破…