也参考了一些博主写的整合的内容,发现他们使用的Elasticsearch版本都比较旧,实际我在整合的过程中,SpringBoot2.2做了很好的适配,因为前面我使用的Elasticsearch版本为6.8.9,也能直接使用,但在这里我还是将对应的版本关系贴出来供参考。
Spring Data Elasticsearch | Elasticsearch |
---|---|
3.1.x | 6.2.2 |
3.0.x | 5.5.0 |
2.1.x | 2.4.0 |
2.0.x | 2.2.0 |
1.3.x | 1.5.2 |
由于Elasticsearch的版本更新较快,我们可以根据上面的版本关系图寻找适合的Spring Data Elasticsearch的依赖版本进行配置。
引入相关依赖
在前面的Elasticsearch的简介中已经说过了怎么使用docker部署,这边就不再重新介绍。
<!-- SpringBoot默认使用SpringData 进行Elasticsearch操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
SpringBoot2.0中支持两种操作Elasticsearch的方式,一种是Rest Client,一种是Spring Data,在入门这块我使用Spring Data进行演示,因为操作比较简单易懂。在properties文件中添加Elasticsearch相关连接信息。
# 配置elasticsearch连接信息
spring.data.elasticsearch.cluster-name=docker-cluster
spring.data.elasticsearch.cluster-nodes=服务器地址:9300
此处的集群名称使用我们访问服务器的9200端口获得,注意此处的集群节点填的是9300端口,因为我们使用的是Java进行连接。
编写实体类以及ElasticsearchRepository接口的子接口
使用Spring Data操作Elasticsearch又有两种方法,一是编写ElasticsearchRepository的子接口,二是直接使用ElasticsearchTemplate进行操作,这边介绍第一种方法,因为第一种方法较为灵活。
package com.ross.elasticsearch.entity;
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;
@Data
//由于ES中存储的都是文档,需要指定存储的对象的索引名和类型
@Document(indexName = "ross",type = "book")
public class Book {
private Integer id;
private String bookName;
private String author;
}
package com.ross.elasticsearch.repository;
import com.ross.elasticsearch.entity.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
//泛型中第一个是要操作的实体类的类型,第二个参数是主键的类型
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
//自定义接口方法
List<Book> findAllByBookName(String bookName);
}
往Elasticsearch中索引(保存)一个对象进行测试。
@Test
void contextLoads() {
Book book = new Book();
book.setId(1);
book.setBookName("三国演义");
book.setAuthor("罗贯中");
//往ES中索引(保存)一个对象
bookRepository.index(book);
}
请求URI进行结果查询,浏览器中输入http://服务器地址:9200/ross/book/_search
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.0,
"hits": [
{
"_index": "ross",
"_type": "book",
"_id": "1",
"_score": 1.0,
"_source": {
"id": 1,
"bookName": "三国演义",
"author": "罗贯中"
}
}
]
}
}
编写ElasticsearchRepository的子接口灵活在可以自定义接口方法,并且无需编写方法的实现,它便能够自动进行关键字匹配。例如上面编写的findAllByBookName()方法符合And关键词匹配,我们进行方法的测试。
@Test
void test(){
List<Book> bookList = bookRepository.findAllByBookName("三");
for (Book book : bookList) {
System.out.println(book.getBookName());
}
}
三国演义
具体的自定义接口方法编写规则可以去Spring官方文档进行查看学习,地址https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.RELEASE/reference/html/#elasticsearch.repositories
总结
由于本人也刚接触ES不久,也没有相关实战项目的经历,还在学习当中,不过总结总归是好的,为以后造轮子打基础😁。