当前位置: 首页 > news >正文

Spring Boot集成Elasticsearch实战

文章目录

  • 一、简介
  • 二、安装与配置Elasticsearch
  • 三、集成Spring Boot与Elasticsearch
    • 1. 添加依赖与配置文件
    • 2. 创建Elasticsearch数据模型
    • 3. 定义Elasticsearch仓库接口
    • 4. 实现Elasticsearch数据操作
  • 四、基本查询与索引操作
    • 1. 插入与更新数据
    • 2. 删除数据与索引
    • 3. 条件查询与分页查询
      • 在Elasticsearch仓库定义一个分页查询的方法
      • 在业务封装的类中调用该方法
    • 4. 排序与聚合查询
      • 排序
      • 聚合查询
        • 应用场景
  • 五、高级查询与全文检索
    • 1. 多字段匹配与模糊查询
    • 2. 范围查询与正则表达式查询
    • 3. 全文检索与高亮显示
  • 六、总结

一、简介

最近项目中要使用Elasticsearch所以就去简单的学习了一下怎么使用,具体的一些在高级的功能暂时展示不了,能力目前有点限,不过一些基本的需求还是可以满足的。所以就写了一篇整理一下也希望能够指出不足之处

二、安装与配置Elasticsearch

docker部署
正常部署

三、集成Spring Boot与Elasticsearch

1. 添加依赖与配置文件

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
spring:elasticsearch:rest:uris: 127.0.0.1:9200 #可配置多个,以逗号间隔举例: ip,ipconnection-timeout: 1read-timeout: 30

2. 创建Elasticsearch数据模型

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.util.Date;/*** @BelongsProject: spring-elas* @BelongsPackage: com.example.springelas.elas.entity* @Author: gepengjun* @CreateTime: 2023-09-07  09:16* @Description: TODO* @Version: 1.0*/
@Data
@Document(indexName = "book",createIndex = true)
public class Book {@Id@Field(type = FieldType.Text)private String id;@Field(analyzer="ik_max_word")private String title;@Field(analyzer="ik_max_word")private String author;@Field(type = FieldType.Double)private Double price;@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")@Field(type = FieldType.Date,format = DateFormat.custom, pattern = "8uuuu-MM-dd'T'HH:mm:ss")private Date createTime;@Field(type = FieldType.Date,format = DateFormat.time)private Date updateTime;/*** 1. Jackson日期时间序列化问题:* Cannot deserialize value of type `java.time.LocalDateTime` from String "2020-06-04 15:07:54": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-06-04 15:07:54' could not be parsed at index 10* 解决:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")* 2. 日期在ES存为long类型* 解决:需要加format = DateFormat.custom* 3. java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=5, YearOfEra=2020, MonthOfYear=6},ISO of type java.time.format.Parsed* 解决:pattern = "uuuu-MM-dd HH:mm:ss" 即将yyyy改为uuuu,或8uuuu: pattern = "8uuuu-MM-dd HH:mm:ss"* 参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats*/
}

3. 定义Elasticsearch仓库接口

public interface ESBookRepository extends ElasticsearchRepository<Book, String> {List<Book> findByTitleOrAuthor(String title, String author);@Highlight(fields = {@HighlightField(name = "title"),@HighlightField(name = "author")})@Query("{\"match\":{\"title\":\"?0\"}}")SearchHits<Book> find(String keyword);
}

4. 实现Elasticsearch数据操作

@Service
public class ESBookImpl {@AutowiredESBookRepository esBookRepository;public void insertBook(Book book){Book a= esBookRepository.save(book);System.out.println(a);}public Book queryBook(String keyWord){return esBookRepository.findById(keyWord).get();}
}

四、基本查询与索引操作

1. 插入与更新数据

在这里插入图片描述

2. 删除数据与索引

    /*** @description: 根据id删除* @author: gepengjun* @date: 2023/9/7 10:35* @param: [keyWord]* @return: void**/public void deleteBook(String keyWord){esBookRepository.deleteById(keyWord);
//        esBookRepository.delete(book);  //可通过实体删除}

首先根据spring提供的findAll方法获取所有数据
在这里插入图片描述
然后调用删除方法,根据id删除
可以看到id为1的数据已经不在了
在这里插入图片描述

3. 条件查询与分页查询

在Elasticsearch仓库定义一个分页查询的方法

 Page<Book> findByTitle(String title, Pageable pageable);

在业务封装的类中调用该方法

    public Object pageBook(String author){Pageable pageable= PageRequest.of(0, 3);return esBookRepository.findByTitle(author,pageable);}

最后在control中调用,可以看一下执行情况
在这里插入图片描述

4. 排序与聚合查询

排序

这是查询全部进行的排序,如果有需要根据条件查询进行排序,可以参考上面的分页自行设置。

    public Object findDESCBook(){//设置排序规则,针对某个字段排序Sort sort = Sort.by(Sort.Direction.DESC, "price");return esBookRepository.findAll(sort);}

根据价格字段进行排序

在这里插入图片描述

聚合查询

这个聚合查询还有点小瑕疵。

@Autowiredprivate ElasticsearchOperations elasticsearchOperations;/*** @description: 聚合查询* @author: gepengjun* @date: 2023/9/7 11:37* @param: []* @return: java.lang.Object**/public Object findAggregationBOOK(String title){Pageable pageable= PageRequest.of(0, 3);TermsAggregationBuilder builder1 = AggregationBuilders.terms("taxonomy").field("title.keyword");//构建查询NativeSearchQuery build = new NativeSearchQueryBuilder().addAggregation(builder1).withPageable(pageable).build();SearchHits<Book> search = elasticsearchOperations.search(build, Book.class);for (SearchHit<Book> bookSearchHit : search) {System.out.println(bookSearchHit.getContent());}Aggregations aggregations = search.getAggregations();Map<String, Aggregation> asMap = aggregations.getAsMap();return asMap;}

在这里插入图片描述

应用场景

聚合查询是 Elasticsearch 中的一项重要功能,可用于从大量数据中提取有意义的汇总信息和统计结果。以下是聚合查询在 Elasticsearch 中的几个常见应用场景总结:

  1. 数据分析和统计:聚合查询可以对大量数据进行统计和分析,如计算平均值、求和、最大值、最小值等。它可以用于生成报表、绘图或执行复杂的数据分析任务。

  2. 分组统计:聚合查询使我们能够根据指定的字段对数据进行分组,并计算每个组的统计结果。例如,在电子商务中,可以根据商品类别对销售数据进行分组统计,以获得每个类别的销售额或销售量。

  3. 嵌套聚合:Elasticsearch 支持将多个聚合操作嵌套在一起,以实现更复杂的统计和分析需求。通过构建多级嵌套聚合,可以深入了解数据之间的关系,并获取更详细的洞察力。

  4. 时间分析:聚合查询在时间序列数据分析中非常有用。它可以按照指定的时间间隔对数据进行分桶,然后在每个时间段内执行统计分析操作。例如,可以按小时、天、周或月对访问日志数据进行时间分析。

  5. 桶(Bucket)分析:桶聚合是一种将数据分割为不同桶(bucket)或区间的聚合方式。可以通过范围、词条匹配或脚本等方式定义桶的条件,并对每个桶进行统计分析。

  6. 基数和去重计数:聚合查询还支持基数统计和去重计数。可以查找某个字段中的唯一值的数量,或者对其中的重复值进行计数。

  7. 多字段统计:Elasticsearch 允许在一个聚合操作中统计多个字段的信息。这对于同时分析多个指标或维度非常有用。

五、高级查询与全文检索

1. 多字段匹配与模糊查询

    /*** @description: 多字段匹配查询* @author: gepengjun* @date: 2023/9/7 15:40* @param: [field1, field2]* @return: java.util.List<com.example.springelas.elas.entity.Book>**/List<Book> findByAuthorOrPrice(String field1, String field2);/*** @description: 针对一个字段模糊查询* @author: gepengjun* @date: 2023/9/7 15:40* @param: [pattern]* @return: java.util.List<com.example.springelas.elas.entity.Book>**/List<Book> findByAuthorLike(String pattern);

2. 范围查询与正则表达式查询

        /*** @description: 查询某一个字段根据正则表达式* @author: gepengjun* @date: 2023/9/7 15:41* @param: [regexPattern]* @return: java.util.List<com.example.springelas.elas.entity.Book>**/List<Book> findByAuthorRegex(String regexPattern);//具体使用即使直接传入一个正则表达式
List<Book> entityList = esBookRepository.findByAuthorRegex("^abc.*");

3. 全文检索与高亮显示

这个就是高亮

    @Highlight(fields = {@HighlightField(name = "title"),@HighlightField(name = "author")})@Query("{\"match\":{\"title\":\"?0\"}}")SearchHits<Book> find(String keyword);

六、总结

el的使用就和我们使用的一些orm框架一样,所以spring提供的这个和el交互的包放在了data下。

相关文章:

Spring Boot集成Elasticsearch实战

文章目录 一、简介二、安装与配置Elasticsearch三、集成Spring Boot与Elasticsearch1. 添加依赖与配置文件2. 创建Elasticsearch数据模型3. 定义Elasticsearch仓库接口4. 实现Elasticsearch数据操作 四、基本查询与索引操作1. 插入与更新数据2. 删除数据与索引3. 条件查询与分页…...

【python零基础入门学习】python基础篇之文件对象open、模块以及函数的使用(三)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...

【JavaEE】_CSS常用属性值

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…...

vue组件库开发,webpack打包,发布npm

做一个像elment-ui一样的vue组件库 那多好啊&#xff01;这是我前几年就想做的 但webpack真的太难用&#xff0c;也许是我功力不够 今天看到一个视频&#xff0c;早上6-13点&#xff0c;终于实现了&#xff0c;呜呜 感谢视频的分享-来龙去脉-大家可以看这个视频&#xff1a;htt…...

Java中快速排序的优化技巧:随机取样、三数取中和插入排序

目录 快速排序基础 优化1&#xff1a;随机取样 优化2&#xff1a;三数取中 优化3&#xff1a;插入排序 总结&#xff1a; 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它的平均时间复杂度为O(n log n)。然而&#xff0c;在某些情况下&…...

【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求

删除字符串中的子串或者字符以满足题意要求 1234. 替换子串得到平衡字符串680. 验证回文串917. 仅仅反转字母 1234. 替换子串得到平衡字符串 题目链接&#xff1a;1234. 替换子串得到平衡字符串 题目内容&#xff1a; 题目中给出了平衡字符串的定义——只有’Q’&#xff0c;…...

【Unity基础】3.脚本控制物体运动天空盒

【Unity基础】3.脚本控制物体运动&天空盒 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;搭建开发环境 &#xff08;1&#xff09;下载visual studio 在我们下载unity编译器的时候&…...

Spring MVC拦截器

拦截器&#xff08;Interceptor&#xff09;是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截&#xff0c;并在请求进入控制器&#xff08;Controller&#xff09;之前、控制器处理完请求后、甚至是渲染视图后&#xff0c;执行一些指定的操作。 在 Spring MV…...

ClickHouse的Join算法

ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库&#xff08;OLAP&#xff09;&#xff0c;专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能&#xff0c;分析型数据库&#xff08;OLAP&#xff09;通常将表组合在一起形成一个…...

java面试题-RabbitMQ面试题

RabbitMQ面试题 面试官&#xff1a;RabbitMQ-如何保证消息不丢失 候选人&#xff1a; 嗯&#xff01;我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的&#xff0c;这里面就要求了消息的高可用性&#xff0c;我们要保证消息的不丢失。主要从三个层面考虑 第一…...

数据仓库-核心概念

数据仓库 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它是单个数据存储&#xff0c;出于分析性报告和决策支持目的而创建。为需要业务智能的…...

java中的实体类

在Java与数据库交互时&#xff0c;设计实体类有以下几个原因&#xff1a; 1、对象关系映射&#xff08;ORM&#xff09;&#xff1a;实体类提供了一种将数据库中的表映射为Java对象的方式。这样&#xff0c;开发人员可以使用面向对象的方式操作数据库&#xff0c;而无需编写大…...

使用Puppeteer爬取地图上的用户评价和评论

导语 在互联网时代&#xff0c;获取用户的反馈和意见是非常重要的&#xff0c;它可以帮助我们了解用户的需求和喜好&#xff0c;提高我们的产品和服务质量。有时候&#xff0c;我们需要从地图上爬取用户对某些地点或商家的评价和评论&#xff0c;这样我们就可以分析用户对不同…...

GLSL ES着色器语言 使用矢量和矩阵的相关规范

目录 矢量和矩阵类型 下面是声明矢量和矩阵的例子&#xff1a; 赋值和构造 矢量构造函数 矩阵构造函数 构造矩阵的几种方式 访问元素 . 运算符 矢量的分量名 &#xff3b; &#xff3d;运算符 运算符 矢量和矩阵可用的运算符 矢量和矩阵相关运算 矢量和浮点数的…...

Himall商城- web私有方法

目录 1 Himall商城- web私有方法 1.1 /// 获取售价 1.1.1 //商品批量销售价 1.1.2 //获取组合购的价格 Himall商城- web私有方法 #region web私有方法 /// <summary> /// 获取售价 /// <para>己计算会员折</para> /// </summary> /// <para…...

Spring Boot 整合 Redis,使用 RedisTemplate 客户端

文章目录 一、SpringBoot 整合 Redis1.1 整合 Redis 步骤1.1.1 添加依赖1.1.2 yml 配置文件1.1.3 Config 配置文件1.1.4 使用示例 1.2 RedisTemplate 概述1.2.1 RedisTemplate 简介1.2.2 RedisTemplate 功能 二、RedisTemplate API2.1 RedisTemplate 公共 API2.2 String 类型 A…...

Tomcat 接收请求并传递给工作线程池流程

文章目录 Tomcat 接收请求并传递给工作线程池流程接收 socket 连接 org.apache.tomcat.util.net.SocketProcessorBase#reset结论 Tomcat 接收请求并传递给工作线程池流程 接收 socket 连接 有两个线程 http-nio-8080-ClientPoller-0/1 &#xff08;下文称为 clientPoller&…...

在Linux系统上用C++将主机名称转换为IPv4、IPv6地址

在Linux系统上用C将主机名称转换为IPv4、IPv6地址 功能 指定一个std::string类型的主机名称&#xff0c;函数解析主机名称为IP地址&#xff0c;含IPv4和IPv6&#xff0c;解析结果以std::vector<std::string>类型返回。解析出错或者解析失败抛出std::string类型的异常消…...

【硬件设计】硬件学习笔记二--电源电路设计

硬件学习笔记二--电源电路设计 一、LDO设计1.1 LDO原理1.2 LDO参数1.3 应用 二、DC-DC设计2.1 DC-DC原理2.2 DC-DC参数介绍2.4 DC-DC设计要点2.5 DC-DC设计注意事项 写在前面&#xff1a;本篇笔记来自王工的硬件工程师培训课程&#xff0c;想要学硬件的同学可以去腾讯课堂直接搜…...

day34 集合总结

集合总结 一、概述 作用&#xff1a;存储对象的容器&#xff0c;代替数组的&#xff0c;使用更加的便捷 所处的位置&#xff1a;java.util 体系结构 二、Collection 内部的每一个元素都得是引用数据类型 常用方法 add(Object o) 添加元素 addAll(Collection c) 将指定集…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...