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

一文读懂SpringBoot整合Elasticsearch(一)

(本篇文章主要介绍Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。)

一、前言

Elasticsearch是一款全文搜索引擎,可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架,它提供了简单易用的方式来构建Web应用程序。本文将介绍如何使用Spring Boot整合Elasticsearch,实现快速、高效地存储和搜索数据的功能。

二、环境准备

在开始整合Elasticsearch之前,需要确保已经安装了Java开发环境和Elasticsearch服务。可以从官方网站下载最新版本的Java和Elasticsearch。

三、引入依赖

Spring Boot整合Elasticsearch需要引入以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

四、基本配置

在application.properties文件中添加以下配置信息:

kotlinCopy codespring.data.elasticsearch.cluster-name=my-application
spring.data.elasticsearch.cluster-nodes=localhost:9300

其中,cluster-name是Elasticsearch集群的名称,cluster-nodes是Elasticsearch服务的地址和端口号。

数据操作

  1. 创建实体类

首先需要创建一个实体类,用来表示要存储在Elasticsearch中的数据。例如,创建一个名为Book的实体类,包含id、title、author、content等属性。

public class Book {private Long id;private String title;private String author;private String content;//省略getter和setter方法
}

2 创建ElasticsearchRepository

在Spring Boot中,可以使用ElasticsearchRepository来操作Elasticsearch。创建一个名为BookRepository的接口,继承ElasticsearchRepository,指定实体类和主键类型。例如:

public interface BookRepository extends ElasticsearchRepository<Book, Long> {
}

3 数据操作

现在可以使用BookRepository来对Elasticsearch中的数据进行操作。例如,可以使用save方法将一个Book对象保存到Elasticsearch中。

@Autowired
private BookRepository bookRepository;Book book = new Book();
book.setId(1L);
book.setTitle("Java编程思想");
book.setAuthor("Bruce Eckel");
book.setContent("Java编程思想是一本Java经典著作。");
bookRepository.save(book);

四、搜索功能

  1. 创建查询接口

首先需要创建一个查询接口,用来定义查询方法。例如,创建一个名为BookService的接口,包含一个名为search的方法,用来根据关键词查询数据。

public interface BookService {List<Book> search(String keyword);
}

2 创建查询实现类

接着需要创建一个查询实现类,实现BookService接口中的search方法。在实现类中注入BookRepository,使用它来查询Elasticsearch中的数据。

@Service
public class BookServiceImpl implements BookService {@Autowiredprivate BookRepository bookRepositoryOverride
public List<Book> search(String keyword) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery(keyword)).build();return bookRepository.search(searchQuery).getContent();
}

在上面的代码中,首先创建了一个SearchQuery对象,它表示查询条件。使用NativeSearchQueryBuilder来构建查询条件,其中withQuery方法接受一个QueryBuilder对象作为参数,用来指定查询语句。这里使用了queryStringQuery方法来构建一个基于关键词的查询语句。 然后,使用bookRepository.search方法来执行查询,返回一个Page对象。调用getContent方法可以获取查询结果。

3. 测试搜索功能

现在可以测试搜索功能了。例如,执行以下代码:

@Autowired
private BookService bookService;List<Book> books = bookService.search("Java");
for (Book book : books) {
System.out.println(book.getTitle());
}

这段代码会查询所有标题包含“Java”的图书,并将它们的标题打印出来。

五、总结

本文介绍了Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。通过Spring Boot整合Elasticsearch,可以方便快捷地实现数据存储和搜索功能。

六、常见问题解决

在整合Elasticsearch的过程中,可能会遇到一些常见的问题。下面是一些解决方法:

  1. Elasticsearch服务无法连接

如果在运行Spring Boot应用程序时遇到“Elasticsearch服务无法连接”的错误,请确保已经启动Elasticsearch服务,并检查application.properties文件中的cluster-nodes配置是否正确。

2 无法创建索引

如果在使用ElasticsearchRepository保存数据时遇到“无法创建索引”的错误,请检查实体类的注解是否正确,例如是否添加了@Document注解,并指定了indexName和type。

3 搜索结果为空

如果在执行搜索时返回空结果,请检查查询条件是否正确。可以使用Kibana工具来查看Elasticsearch中的数据,并尝试使用Kibana来执行查询语句,以确定查询语句是否正确。

4 分页查询问题

如果想要实现分页查询功能,可以使用Spring Data提供的Pageable接口来实现。例如:

Pageable pageable = PageRequest.of(pageNumber, pageSize);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery(keyword)).withPageable(pageable).build();
return bookRepository.search(searchQuery).getContent();

这里使用了PageRequest.of方法来创建一个Pageable对象,并将它传递给NativeSearchQueryBuilder的withPageable方法。

七、总结

本文介绍了Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。通过Spring Boot整合Elasticsearch,可以方便快捷地实现数据存储和搜索功能。在实践中可能会遇到一些常见问题,需要注意解决。

八、参考资料

  1. Spring Data Elasticsearch官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/
  2. Elasticsearch官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
  3. Spring Boot官方文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
  4. Spring官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/index.html
  5. Kibana官方文档:https://www.elastic.co/guide/en/kibana/current/index.html

九、结语

本文通过实例演示了Spring Boot如何整合Elasticsearch,并介绍了基本配置、数据操作、搜索功能等方面的知识。通过这些内容,读者可以快速上手使用Spring Boot和Elasticsearch来构建数据存储和搜索应用程序。

当然,本文只是一个入门级别的介绍,读者可以深入学习Spring Boot和Elasticsearch的更多知识,来构建更为复杂的应用程序。希望读者在学习过程中能够积极思考,不断提高自己的技能和能力。

 

相关文章:

一文读懂SpringBoot整合Elasticsearch(一)

&#xff08;本篇文章主要介绍Spring Boot如何整合Elasticsearch&#xff0c;包括基本配置、数据操作、搜索功能等方面。&#xff09; 一、前言 Elasticsearch是一款全文搜索引擎&#xff0c;可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...

(数论)(枚举)(前缀和)1230. K倍区间

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 &#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&…...

万字带你深入理解 Linux 虚拟内存管理(下)

接上文&#xff1a;万字带你深入理解 Linux 虚拟内存管理&#xff08;上&#xff09; 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍&#xff0c;现在我们已经熟悉了进程虚拟内存空间的布局&#xff0c;以及内核如何管理这些虚拟内存区域&…...

【iOS】—— JSONModel源码学习

JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客&#xff1a;【iOS】—— JSONMo…...

单片机怎么实现真正的多线程?

所谓多线程都是模拟的&#xff0c;本质都是单线程&#xff0c;因为cpu同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换&#xff0c;看起来像同时执行的样子。据说最近有多核的单片机&#xff0c;不过成本应该会高很多。对于模拟的多线程&#xff0c;我知道的有两种…...

【LeetCode】剑指 Offer(23)

目录 题目&#xff1a;剑指 Offer 46. 把数字翻译成字符串 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 46. 把…...

[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 汽车威胁狩猎专栏长期更新&#xff0c;本篇最新内容请前往&#xff1a; …...

LinuxFTP文件传输服务和DNS域名解析服务

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

二叉搜索树原理及底层实现

二叉搜索树BST 概念 二叉搜索树又称二叉排序树&#xff0c;它可以是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a;若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值&#xff1b;若它的右子树不为空&#xff0c;则右子树上所有节点的值都…...

python自动化办公(一)

本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数&#xff0c;常用前4个&#xff0c;除了file参数外&#xff0c;其他参数都有默认值。file指定了要打开的文件名称&a…...

LeetCode - 198 打家劫舍

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装…...

简单粗暴的分布式定时任务解决方案

分布式定时任务1.为什么需要定时任务&#xff1f;2.数据库实现分布式定时任务3.基于redis实现1.为什么需要定时任务&#xff1f; 因为有时候我们需要定时的执行一些操作&#xff0c;比如业务中产生的一些临时文件&#xff0c;临时文件不能立即删除&#xff0c;因为不清楚用户是…...

蓝桥杯第五天刷题

第一题&#xff1a;数的分解题目描述本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。把 2019 分解成 3 个各不相同的正整数之和&#xff0c;并且要求每个正整数都不包含数字 2和 4&#xff0c;一共有多少种不同的分解方法&…...

Java数组的定义和使用(万字详解)

目录 ​编辑 一. 数组的基本概念 1、什么是数组 2、数组的创建及初始化 1、数组的创建 2、数组的初始化 3、数组的使用 &#xff08;1&#xff09;数组中元素访问 &#xff08;3&#xff09;遍历数组 二、数组是引用类型 1、初始JVM的内存分布 2、基本类型变量与引用类…...

【SpringBoot】自定义Starter

&#x1f6a9;本文已收录至专栏&#xff1a;Spring家族学习之旅 &#x1f44d;希望您能有所收获 一.概述 在使用SpringBoot进行开发的时候&#xff0c;我们发现使用很多技术都是直接导入对应的starter&#xff0c;然后就实现了springboot整合对应技术&#xff0c;再加上一些简…...

【C陷阱与缺陷】----语法陷阱

&#x1f4af;&#x1f4af;&#x1f4af; 要理解一个C程序&#xff0c;必须理解这些程序是如何组成声明&#xff0c;表达式&#xff0c;语句的。虽然现在对C的语法定义很完善&#xff0c;几乎无懈可击&#xff0c;大门有时这些定义与人们的直觉相悖&#xff0c;或容易引起混淆…...

虹科分享| 关于TrueNAS十问十答

上一篇文章我们向您介绍了虹科新品HK-TrueNAS企业存储&#xff0c;很多小伙伴会疑问到底什么是NAS存储&#xff0c;之前常用的磁盘、磁带属于什么存储架构&#xff0c;NAS存储好在哪里&#xff0c;什么时候使用NAS&#xff1f;今天我们整理了关于TrueNAS的十问十答&#xff0c;…...

Https 笔记

HTTP TLS TLS 的前身是 SSL 非对称加密的核心&#xff1a; 两个密钥&#xff08;公私&#xff09; https 需要第三方CA&#xff08;证书授权中心&#xff09;申请SSL证书以确定其真实性 证书种包含了特定的公钥和私钥 密钥交换 自己将私钥上锁后发给对方对方也上锁 在还回来…...

【Python+requests+unittest+excel】实现接口自动化测试框架

一、框架结构&#xff1a; 工程目录 二、Case文件设计 三、基础包 base 3.1 封装get/post请求&#xff08;runmethon.py&#xff09; 1 import requests2 import json3 class RunMethod:4 def post_main(self,url,data,headerNone):5 res None6 if heade…...

MySQL终端的使用及其数据类型的使用

什么是数据库&#xff1f;数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。我们也可以将数据存储在文件中&#xff0c…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...