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

news2025/1/19 3:04:00

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
官网很完整的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.coloradmin.cn/o/1340125.html

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

相关文章

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源&#xff08;内存、负载、磁盘容量&#xff09;》&#xff0c;这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…

CSDN规则详解——csdn那些你不知道的事儿(点赞、评论、收藏)

文章目录 每日一句正能量前言点赞评论收藏原力等级和博客等级后记 每日一句正能量 “只有奋斗者才能成为胜利者&#xff0c;只有坚持者才能创造奇迹。” - 迈克尔乔丹 这句话来自于世界著名篮球运动员迈克尔乔丹&#xff0c;他以无与伦比的天赋和努力成为了篮球界的传奇人物。他…

产品经理如何培养思维模式和创新能力?

作为一名产品经理&#xff0c;我们需要具备一定的思维模式和创新能力&#xff0c;以应对不断变化的市场和技术环境。在本文中&#xff0c;我将分享一些培养产品经理思维模式和创新能力的方法。 一、培养市场洞察力 作为产品经理&#xff0c;我们需要深入了解市场和用户需求&a…

表单(HTML)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>个人信息</title></head><body><h1>个人信息</h1><form><fieldset><legend>基本信息</legend><label for"…

【日常聊聊】编程语言的未来:趋势、多样性、人工智能融合、教育与生态系统

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 1. 编程语言的发展趋势 1.1 新语言和编程范式的涌现 1.2 影响和挑战 2. 编程语言的多样性 2.1 互操作性和可移…

爬虫工作量由小到大的思维转变---<第三十章 Scrapy Redis 第一步(配置同步redis)>

前言: 要迈向scrapy-redis进行编写了;首要的一步是,如何让他们互通?也就是让多台电脑连一个任务(这后面会讲); 现在来做一个准备工作,配置好redis的同步!! 针对的是windows版本的redis同步,实现主服务和从服务共享一个redis库; 正文: 正常的redis for windows 的安装这里就…

制作gif动图软件,视频转gif动图生成器

生活在这个快节奏的时代&#xff0c;我们总是希望能够抓住那些转瞬即逝的美好。而gif动图&#xff0c;正是这样一种能够让时间静止、让美好定格的存在。从视频到gif动图&#xff0c;不仅仅是格式的转换&#xff0c;更是情感的传递与分享。 所需工具&#xff1a; 一个【媒体梦…

Fiddler工具 — 2.补充:HTTP协议介绍(一)

1、HTTP协议介绍 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写&#xff0c;是用于从万维网(WWW:World Wide Web )服务器传输超文本&#xff08;也可以说是资源&#xff09;到本地浏览器的传送协议。 HTTP协议是基于TCP协议的应用层协议&#xff0c;它不关心…

K8S 全局架构图 —— 筑梦之路

kube-apiserver&#xff1a; Kubernetes API 服务器验证并配置 API 对象的数据&#xff0c; 这些对象包括 pods、services、replicationcontrollers 等。API 服务器为 REST 操作提供服务&#xff0c;并为集群的共享状态提供前端&#xff0c; 所有其他组件都通过该前端进行交互。…

docker学习笔记01-安装docker

1.Docker的概述 用Go语言实现的开源应用项目&#xff08;container&#xff09;&#xff1b;克服操作系统的笨重&#xff1b;快速部署&#xff1b;只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统&#xff1b;Docker通过隔离机制&#xff0c;每个容器间是互相隔离…

Java可视化物联网智慧工地云平台源码支持人脸识别考勤

智慧工地是指利用云计算、大数据、物联网、移动互联网、人工智能等技术手段&#xff0c;为建筑施工现场提供智能硬件及物联网平台的解决方案&#xff0c;以实现建筑工地的实时化、可视化、多元化、智慧化和便捷化。智慧工地通过全新的工程全生命周期管理理念&#xff0c;利用物…

克魔助手:方便查看iPhone应用实时日志和奔溃日志工具

查看ios app运行日志 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块&#xff0c;可以对苹果奔溃日志进行符号化、格式化和分析&#xff0c;极…

QML —— Slider示例(附完整源码)

示例 - 效果 实例 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {id: rootIdvisible: truewidth: 640height: 480title: qsTr("Hello World")Column{spacing: 50anchors.centerIn: paren…

无公网IP环境如何实现远程访问家里内网威联通QNAP NAS中存储的文件

文章目录 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xf…

Node.js--》node环境配置及nvm和nvm-desktop安装教程

博主最近换了台新电脑&#xff0c;环境得从零开始配置&#xff0c;所以以下是博主从一台纯净机中配置环境&#xff0c;绝对的小白教程&#xff0c;大家第一次安装完全可以参考我的过程&#xff0c;闲话少说&#xff0c;直接开始&#xff01;&#xff01;&#xff01; 接下来介绍…

【五】【C语言\动态规划】删除并获得点数、粉刷房子、买卖股票的最佳时机含冷冻期,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

Linux磁盘与文件管理

目录 一、磁盘介绍 1. 磁盘数据结构 2. 磁盘的接口类型 3. 磁盘在Linux上的表现形式 二、磁盘分区与MBR 1. 分区优缺点 2. 分区方式 3. MBR分区 4. GPT分区 三、文件系统 1. 文件系统的组成 2. 默认的文件系统 3. 文件系统的作用 4. 模拟破坏文件与修复文件 4…

软件测试/测试开发丨Python学习笔记之内置库科学计算、日期与时间处理

Python 内置库 - 科学计算 了解 math 函数 math 函数&#xff0c;python 提供的内置数学类函数库&#xff0c;包含了很多数学公式。 比如幂函数运算&#xff0c;三角函数&#xff0c;高等函数运算等。 math 函数操作 数字常数数论与表示函数幂对数函数三角对数函数高等特殊…

vue3-12

需求是用户如果登录了&#xff0c;可以访问主页&#xff0c;如果没有登录&#xff0c;则不能访问主页&#xff0c;随后跳转到登录界面&#xff0c;让用户登录 实现思路&#xff0c;在用户登录之前做一个检查&#xff0c;如果登录了&#xff0c;则token是存在的&#xff0c;则放…

FreeRTOS 实时操作系统第八讲 - 时间管理 (系统节拍,延时函数)

一、系统节拍 FreeRTOS 实时操作系统需要一个时钟节拍&#xff0c;以供系统处理诸如延时、超时、软件定时器等与时间相关的事件。 时钟节拍是周期性定时中断&#xff0c;这个中断可以看做是系统心跳。中断时间间隔取决于不同的应用&#xff0c;一般是 1ms – 100ms。时钟的节拍…