说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。
前言
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的
,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便
。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
而我们在操作Elasticsearch时,需要发送PUT、POST等REST API请求,并在请求体加上json信息来实现具体操作。而SpringBoot为我们整合了Elasticsearch,大大的简化了这些操作,我们只需要调用对应的方法即可完成操作Elasticsearch目的,下面我们来具体来讲述SpringBoot整合Elasticsearch的具体流程,安全带系好,我们要开始粗发了!!!
一、引入依赖
pom.xml(主要导入spring-boot-starter-data-elasticsearch
依赖)
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.5.2version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-elasticsearchartifactId>
<version>2.5.2version>
dependency>
二、配置文件
application.yml
spring:
data:
elasticsearch:
cluster-nodes: 127.0.0.1:9200 # Elasticsearch地址
cluster-name: elasticsearch # 默认为elasticsearch
repositories:
enabled: true # 开启本地存储
三、索引对象
Book.java(创建es的索引对象Book
)
package com.example.estest.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import java.io.Serializable;
@Document(indexName = "book")
public class Book implements Serializable {
@Id
private String id;
@Field
private String name;
public Book(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
四、Dao层对象
BookRepository.java(SpringBoot为我们简化了对Elasticsearch的操作,并封装在了ElasticsearchRepository
对象中,因此我们需要创建一个与新建索引Book对应的Dao层对象来操作es中的Book索引)
package com.example.estest.repository;
import com.example.estest.entity.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface BookRepository extends ElasticsearchRepository<Book, String> {
List<Book> findBooksByName(String name);
}
五、编写测试类
ESTestApplicationTests.java(编写测试类,用于测试BookRepositroy对象对es的增、删、改、查
的操作)
package com.example.estest;
import com.example.estest.entity.Book;
import com.example.estest.repository.BookRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ESTestApplicationTests {
@Autowired
BookRepository bookRepository;
/*
* 插入操作
*/
@Test
void insertTest() {
Book book = new Book("1", "基督山伯爵");
bookRepository.save(book);
System.out.println("插入操作执行成功!");
findAllTest();
}
/*
* 通过文档id进行删除
*/
@Test
void deleteByIdTest() {
bookRepository.deleteById("1");
System.out.println("删除操作执行成功!");
findAllTest();
}
/*
* 修改操作
*/
@Test
void updateTest() {
Book book = bookRepository.findById("1").get();
book.setName("克里斯汀");
bookRepository.save(book);
System.out.println("修改操作执行成功!");
findByIdTest();
}
/*
* 通过文档id查找
*/
@Test
void findByIdTest() {
System.out.println("搜索结果:" + bookRepository.findById("1"));
}
/*
* 查找该索引下所有文档
*/
@Test
void findAllTest() {
Iterable<Book> iter = bookRepository.findAll();
System.out.println("该索引下所有文档:");
for (Book book : iter) {
System.out.println(book);
}
}
}
测试1.增
插入操作:首先实例化一个Book索引对象,并调用dao层BookRepository的save()
方法,将新创建的Book对象存入Elasticsearch中(执行测试类中的insertTest()方法执行结果如下图)
2.查
查找操作:如果我们通过文档id查找数据,可以使用findById()
方法(执行测试类中的findByIdTest()方法执行结果如下图)
3.改
修改操作:Elasticsearch中,文档的id是唯一的,如果新插入的数据的文档id已经在es中存在,则es会将新的文档覆盖旧的文档(执行测试类中的updateTest()方法执行结果如下图)
4.删
删除操作:我们只需调用具体方法即可,如按照文档id删除数据,则是deleteById()
方法(测试类中的deleteByIdTest()方法执行结果如下)