Spring Boot集成Elasticsearch实战

news2024/11/12 8:51:33

文章目录

  • 一、简介
  • 二、安装与配置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,ip
      connection-timeout: 1
      read-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 {
    @Autowired
    ESBookRepository 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);
    }

根据价格字段进行排序

在这里插入图片描述

聚合查询

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


    @Autowired
    private 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下。

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

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

相关文章

aarch64 arm64 部署 stable diffusion webui 笔记 【3】

接上篇 aarch64 arm64 部署 stable diffusion webui 笔记 【2】继续安装其他依赖 gfpgan-CSDN博客 source venv/bin/activate export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/lib ./webui.sh 离线安装记录 (venv) [yeqiangceph3 stable-diffusio…

人脸识别技术,如何解决学校门禁安全?

在当今社会&#xff0c;学校安全已经成为一个备受关注的议题&#xff0c;而门禁监控系统已经成为学校管理和保障学生安全的重要工具之一。随着社会的不断发展和技术的不断进步&#xff0c;学校不再只是知识传授的场所&#xff0c;它们也成为了数百、数千甚至数万学生和教职员工…

【Spring Boot】JPA — JPA入门

JPA简介 1. JPA是什么 JPA是Sun官方提出的Java持久化规范&#xff0c;它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据&#xff0c;通过注解或者XML描述“对象-关系表”之间的映射关系&#xff0c;并将实体对象持久化到数据库中&#xff0c;极大地简…

欧洲云巨头OVHcloud收购边缘计算专家 gridscale

边缘计算社区近日获悉&#xff0c;欧洲云巨头OVHcloud已进入全面收购德国公司 gridscale 的谈判&#xff0c;该公司是一家专门从事超融合基础设施的软件提供商。 此次战略收购将标志着 OVHcloud 的另一个重要里程碑&#xff0c;使该集团能够显着加速其地理部署&#xff0c;并进…

智能化时代与智慧化时代

当今社会正处于快速发展的时代&#xff0c;科技的进步给我们带来了许多前所未有的机遇和挑战。在这个过程中&#xff0c;我们正逐步迈向智能化时代和智慧化时代&#xff0c;这两个时代代表了技术发展的不同阶段和方向。让我们深入了解这两个时代的概念、特点以及它们对未来的意…

发布 VectorTraits v1.0,它是 C# 下增强SIMD向量运算的类库

发布 VectorTraits v1.0, 它是C#下增强SIMD向量运算的类库 VectorTraits: SIMD Vector type traits methods (SIMD向量类型的特征方法). NuGet: https://www.nuget.org/packages/VectorTraits/1.0.0 源代码: https://github.com/zyl910/VectorTraits 用途 总所周知&#x…

Java死锁的原因及解决方法

要想知道死锁出现的原因和解决方法&#xff0c;首先得知道什么是死锁&#xff0c;死锁是两个或两个以上的运算单元&#xff08;进程、线程或协程&#xff09;&#xff0c;互相持有对方所需的资源&#xff0c;导致它们都无法向前推进&#xff0c;从而导致永久阻塞的问题。从字面…

Spine2D骨骼动画播放器 - 微信小程序版

Spine2D骨骼动画播放器 - 微信小程序版 简介平台支持 界面预览使用说明演示视频 版本笨笨的小目标&#xff08;废话&#xff09;参考资料测试文件百度盘分享 相关文档 简介 本播放器是SpinePlayer的微信小程序版。由于官方并没有提供现成的运行库&#xff0c;只能自己改造。 设…

如何应用运营商大数据精准营销?

如何应用运营商大数据精准营销&#xff1f; 越来越多的企业逐渐觉察到运营商大数据所带来的商业价值&#xff0c;精准营销也被他们用的越来越娴熟。那么&#xff0c;企业的大数据精准营销该如何应用呢&#xff1f;想必是很多资源有限的中小型公司最想了解的。 一 数据驱动运营…

springCloud-LoadBalancer负载均衡

接上个博客springcloud-Eureka。 Eureka主要是如何通过eureka服务器进行服务注册与发现&#xff0c;也有简单的负载均衡&#xff0c;实际上它其中的负载均衡就是靠LoadBalancer实现的。 2020年前SpringCloud是采用Ribbon作为负载均衡实现&#xff0c;但是在2020后采用了LoadBal…

部署elasticsearch集群

创建es集群 编写一个docker-compose.yaml文件&#xff0c;内容如下 version: 2.2 services:es01:image: elasticsearch:7.12.1container_name: es01environment:- node.namees01- cluster.namees-docker-cluster- discovery.seed_hostses02,es03- cluster.initial_master_nod…

大数据安全 | (一)介绍

目录 &#x1f4da;大数据安全 &#x1f407;大数据安全内涵 &#x1f407;大数据安全威胁 &#x1f407;保障大数据安全 ⭐️采集环节安全技术 ⭐️存储环节安全技术 ⭐️挖掘环节安全技术 ⭐️发布环节安全技术 &#x1f407;大数据用于安全 &#x1f4da;隐私及其…

CSS笔记(黑马程序员pink老师前端)选择器,字体,文本属性,Emmet语法,元素显示模式,CSS背景

选择器 选择器分为基础选择器和复合选择器两大类。 基础选择器 包括:标签选择器、类选择器、id选择器和通配符选择器。 /*标签选择器 */p {color: red;}/*类选择器 */.classname {color: yellow;}/*id选择器 */#idname {color: blue;}/*通配符选择器&#xff0c;选择页面所有的…

核心实验10_hybrid(实现access和trunk功能)_ENSP

项目场景&#xff1a; 核心实验10_hybrid&#xff08;实现access和trunk功能&#xff09;_ENSP 用hybrid的属性 是否打标签来达到替代使用access或trunk接口的目的 实搭拓扑图&#xff1a; 具体操作&#xff1a; SW1: [sw1]vlan 10 [sw1-vlan10]int g0/0/1 [sw1-GigabitEther…

ChatGPT 超有用提示词 练习雅思口语

目录 Prompts &#x1f53b;作为一个英语口语老师和提高英语口语 方法1&#xff1a;口语简单练习 方法2&#xff1a;角色扮演练习口语 作为一个英语翻译/英语作文优化师/稿件校对 作为一个”职位”面试官 学习英文单词 演员 苏菲 玛索 阿尔弗雷多詹姆斯帕西诺 要孝顺…

LeetCode 1113.报告的记录

数据准备 Create table If Not Exists Actions (user_id int, post_id int, action_date date, action ENUM(view, like, reaction, comment, report, share), extra varchar(10)); Truncate table Actions; insert into Actions (user_id, post_id, action_date, action, ext…

Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化...

全文链接&#xff1a;https://tecdat.cn/?p33566 生成对抗网络&#xff08;GAN&#xff09;是一种神经网络&#xff0c;可以生成类似于人类产生的材料&#xff0c;如图像、音乐、语音或文本&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 最近我们…

Unity 之 Material (材质)渲染3D对象的重要组件

文章目录 介绍一些代码例子 介绍 在Unity中&#xff0c;Material&#xff08;材质&#xff09;是一种用于渲染3D对象的重要组件。Material定义了对象的外观&#xff0c;包括其颜色、纹理、光照属性和反射等。以下是关于Material的详细介绍&#xff1a; 创建Material&#xff1…

IDEA报错:No valid Maven installation found

当我想要用maven进行clean的时候&#xff0c;发现报了这个错误&#xff0c;idea的event logs记录为 网上又说可能是因为你的maven环境没有配置好&#xff0c;我对我的maven进行了检查&#xff0c;发现是没有问题的&#xff0c;在这里提醒大家&#xff0c;如果你以前的项目maven…

Java入门第三季

一、异常与异常处理 1. 异常简介 在Java中&#xff0c;**异常是程序在执行过程中出现的问题或意外情况&#xff0c;导致程序无法按照预期的流程进行。**异常处理是Java中用于处理程序中出现的异常的一种机制。 Java中的异常可以分为两大类&#xff1a;受检查的异常&#xff…