我们经常需要添加检索功能,开源的ElasticSearch是目前全文搜索引擎的首选,它可以快速存储,搜索和分析海量数据。Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持。
ElasticSearch是一个分布式搜索服务,提供了Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding功能,github等大型的站点也是采用Elastic Search作为其搜索服务。
ElasticSearch是面向文档的,他存储整个对象或文档。在ElasticSearch中,你对文档进行索引,检索,排序和过滤,而不是对行列数据。
概念:
以员工文档的形式存储为例:一个文档代表一个员工数据,存储数据到ElasticSearch的行为叫做索引,但在索引一个文档之前,需要确定将文档存储在哪里。
一个ElasticSearch集群可以包含多个索引,相应的每个索引可以包含多个类型。这些不同的类型存储着多个文档,每个文档又有多个属性。
*索引-数据库
*类型-表
*文档-表中的记录
*属性-列
以索引库megacorp,类型employee,文档id为例:
存储:使用PostMan向ElasticSearch存储数据:地址:http://localhost:9200/megacorp/employee/1,消息体为JSON格式,请求方式为PUT。
将PUT请求替换为GET即可,DELETE为删除,HEAD为检测有无。
请求所有信息:GET /megacrop/employee/_search
条件搜索: GET /megacorp/employee/_search?q=last_name:xuyu
使用查询表达式搜索:
POST /megacorp/employee/_search
{
"query" : {
"bool" : {
"must" : {
"match" : {
"last_name" : "xuyu"
}
},
"filter" : {
"range" : {
"age" : {"gt" : 30}
}
}
}
}
}
1.引入spring-boot-starter-data-elasticsearch
2.安装Spring Data对应版本的ElasticSearch
3.application.yml配置
4.Springboot自动配置的ElasticSearchRepository,ElasticSearchTemplate,Client
5.测试。
导入pom:
org.springframework.boot
spring-boot-starter-data-elasticsearch
io.searchbox
jest
5.3.3
实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "xuyu",type="book") //加上索引注解
public class Book {
private Integer id;
private String bookName;
private String author;
}
实现类:
import com.bootbootboot.springboot01cache.bean.Article;
import com.bootbootboot.springboot01cache.bean.Book;
import com.bootbootboot.springboot01cache.repository.BookRepository;
import io.searchbox.client.JestClient;
import io.searchbox.core.Index;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
public class ElasticSearchService {
/**
* 检索
* springboot默认支持2种技术和ES交互:
* 1.Jest(默认不生效,需要导入jest工具包(io.searchbox.client.JestClient))
* 2.SpringData ElasticSearch
* 1.client节点信息clusterNodes : clusterName
* 2.ElasticsearchTemplate操作es
* 3.编写一个ElasticSearchRepository的子接口来操作ES
* 注意:ES版本不适配问题,版本适配说明:https://github.com/spring-projects/spring-data-elasticsearch。如果版本不适配:
* 1.升级SpringBoot版本
* 2.安装对应版本的ES
* 两种用法:
* 1.编写一个ElasticsearchRepository
*/
/*************通过Jest整合ES******************/
@Autowired
JestClient jestClient;
public void jestSave() {
//1.给ES中索引(保存)一个文档
Article article = new Article();
article.setId(1);
article.setTitle("goodnews");
article.setAuthor("xuyu");
article.setContent("hello world!");
//构建一个索引功能
Index index = new Index.Builder(article).index("xuyu").type("news").build();
try {
//执行
jestClient.execute(index);
} catch (IOException e) {
e.printStackTrace();
}
}
//搜索
public void jestSearch(){
String json="{\n" +
" \"query\" : {\n" +
" \"match\" : {\n" +
" \"content\" : \"hello\"\n" +
" }\n" +
" }\n" +
"}";
//构建搜索
Search search = new Search.Builder(json).addIndex("xuyu").addType("news").build();
//执行
try {
SearchResult execute = jestClient.execute(search);
String jsonString = execute.getJsonString();
System.out.println(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
}
/***********************end****************************/
/***********************ElasticsearchTemplate操作es*************/
@Autowired
BookRepository bookRepository;
//保存
public void templateSave(){
Book book = new Book(1,"xuyu","xuyu"); //需要在类上加@Document(indexName = "xuyu",type="book")注解
bookRepository.index(book);
}
//查询
public void templateFind(){
for (Book book : bookRepository.findByBookNameLike("x")) {
System.out.println(book);
}
}
/*************************end*************************************/
}
public interface BookRepository extends ElasticsearchRepository {
//支持自定义查询
public List findByBookNameLike(String bookName);
}