网上 SpringBoot 集成 Elasticsearch 的文章很多,但随着 SpringBoot 和 Elasticsearch 版本的不断升级,绝大多数文章使用的集成方式和调用的方法已经过时,几乎找不到能真正适用最新 SpringBoot 版本和最新 Elasticsearch 版本的文章。
本文正是基于最新 SpringBoot 版本和最新 Elasticsearch 版本实现了集成。
Elasticsearch(ES) 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch 用于云计算中,能够达到实时搜索、稳定、可靠、快速、安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby 和许多其他语言中都是可用的。根据 DB-Engines 的排名显示,Elasticsearch 是最受欢迎的企业搜索引擎,其次是 Apache Solr,也是基于 Lucene。
见 CentOS7和8下安装Elasticsearch 和 ElasticSearch ik分词器的安装使用。
TransportClient 在 Elasticsearch 7.0.0 中已被弃用,取而代之的是 Java High Level REST Client,并将在 Elasticsearch 8.0中删除。在项目中不再建议使用,详见
官方链接:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.html#java-api
Java REST Client 在 Elasticsearch 7.15.0 中已弃用,取而代之的是 Java API Client。在项目中不再建议使用,详见
官方链接:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html
官方推荐使用的方式。详见
官方链接:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html
Spring Data Elasticsearch 项目提供了与 Elasticsearch 搜索引擎的集成。Spring Data Elasticsearch 的关键功能领域是一个以 POJO 为中心的模型,用于与 Elastichsearch 文档进行交互,并轻松编写存储库数据访问层。
本文正是基于 Spring Data Elasticsearch 方式实现 SpringBoot 集成 Elasticsearch。
新建 Spring Initializr 项目 es,项目下新建 controller、entity、dao、service、impl 类,实现对 Elasticsearch 的 CRUD 操作。
项目目录结构:
添加依赖,如果已按截图操作,pom.xml 的内容会自动生成:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.4version>
<relativePath/>
parent>
<groupId>com.chaoyuegroupId>
<artifactId>esartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>esname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
plugins>
build>
project>
application.yml 文件中添加如下配置:
server:
port: 8080
spring:
elasticsearch:
uris: 192.168.1.38:9200
为减少不必要的代码,引入 lombok 依赖:
org.projectlombok
lombok
1.18.22
实体类代码如下:
package com.chaoyue.es.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
@Data
@Document(indexName = "user")
public class User implements Serializable {
@Id
private String id; // id
private String username; // 用户名
private String password; // 密码
}
package com.chaoyue.es.dao;
import com.chaoyue.es.entity.User;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends ElasticsearchRepository<User, String> {
}
package com.chaoyue.es.service;
import com.chaoyue.es.entity.User;
public interface UserService {
User save(User user);
void delete(User user);
Iterable<User> getAll();
}
package com.chaoyue.es.service.impl;
import com.chaoyue.es.dao.UserRepository;
import com.chaoyue.es.entity.User;
import com.chaoyue.es.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User save(User user) {
return userRepository.save(user);
}
@Override
public void delete(User user) {
userRepository.delete(user);
}
@Override
public Iterable<User> getAll() {
return userRepository.findAll();
}
}
package com.chaoyue.es.controller;
import com.chaoyue.es.entity.User;
import com.chaoyue.es.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/insert")
public String insert() {
User user = new User();
user.setId("1");
user.setUsername("张三");
user.setPassword("zhangsan");
userService.save(user);
return getAll();
}
@RequestMapping("/delete")
public String delete() {
User user = new User();
user.setId("1");
userService.delete(user);
return getAll();
}
@RequestMapping("/getAll")
public String getAll() {
List<User> list = new ArrayList<>();
Iterable<User> iterable = userService.getAll();
iterable.forEach(e->list.add((User) e));
return list.toString();
}
}
启动服务后,浏览器输入:http://localhost:8080/user/insert,会新增一条 id 为 “1” 的记录:
浏览器输入:http://localhost:8080/user/delete,会删除一条 id 为 “1” 的记录:
浏览器输入:http://localhost:8080/user/getAll,会显示所有记录: