阅读:
springboot整合ElasticSearch的API使用,以及自己总结:
https://blog.csdn.net/qq_32832227/article/details/81178415
一、检索
我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选。他可以快速的存储、搜索和分析海量数据。Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持;
Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用了ElasticSearch作为其搜索服务,
二、概念
以 员工文档 的形式存储为例:
一个文档代表一个员工数据。
存储数据到 ElasticSearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。
一个 ElasticSearch 集群可以 包含多个 索引 ,
相应的每个索引可以包含多个 类型 。
这些不同的类型存储着多个文档 ,
每个文档又有 多个 属性 。
类似关系:
索引-数据库
类型-表
文档-表中的记录
属性-列
三、整合ElasticSearch测试
搭建elasticSearch环境:
docker pull elasticsearch:5.6.8
拉取镜像必须指定tag。启动elasticsearch,默认的是占用2G的堆的内存空间我们要限制一下。
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 8f46db60ddd6
接口:9200 web通信的
9300 分布式各个节点的通信
测试启动,打开浏览器:
192.168.244.130:9200
docker查看日志
docker logs 607bdfc4d327
集群的搭建网址:
https://blog.csdn.net/belonghuang157405/article/details/83301937
elasticsearch的官方文档:https://www.elastic.co/cn/#
官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
测试
利用psotman发送请求,这个post应该是put。
分析返回值:
第一个是索引 第二个是类型 第三个是id
继续保存:
PUT /megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
检索数据:
删除数据:
检索是不是存在的,不存在就是404:
查询所有的员工的就是_search
;按照条件查找:
表达式查询:
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
复杂的查询表达式:
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
上面的还是post查询。
全文检索:
查询about这个字段是不是有包含rock climbing。
score是相关性得分。
当作完整的单词匹配不是部分包含的:
只查出一个来。
高亮搜索:
创建工程
打开pom文件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
点进去看下:
分析下ES的自动配置:
看到data堆elasticsearch的支持。
jest对elasticsearch的支持。
默认支持两种技术和elasticsearch就行交互。
/**
* SpringBoot默认支持两种技术来和ES交互;
* 1、Jest(默认不生效)
* 需要导入jest的工具包(io.searchbox.client.JestClient)
* 2、SpringData ElasticSearch【ES版本有可能不合适】
* 版本适配说明:https://github.com/spring-projects/spring-data-elasticsearch
* 如果版本不适配:2.4.6
* 1)、升级SpringBoot版本
* 2)、安装对应版本的ES
*
* 1)、Client 节点信息clusterNodes;clusterName
* 2)、ElasticsearchTemplate 操作es
* 3)、编写一个 ElasticsearchRepository 的子接口来操作ES;
* 两种用法:https://github.com/spring-projects/spring-data-elasticsearch
* 1)、编写一个 ElasticsearchRepository
*/
看下jest的自动配置:
要是生效的话导入包:
看下data对elasticsearch的配置:
配置客户端,指定属性。
看下一个配置文件:
crud的模板。
测试:首先我们测试下jest的这样要在pom文件注掉:
导入jest:
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
看下jest的自动配置是否生效:
不报红了,接下来我们要配置一些属性:
主要是这个属性,看配置的话主要是看xxxAutoConfiguration的。
配置这个:
spring.elasticsearch.jest.uris=http://192.168.244.130:9200
启动:不报错
用这个进行交互。
测试JestClient:
@Autowired
JestClient jestClient;
写两个bean的类:
@Test
public void contextLoads() {
//1、给Es中索引(保存)一个文档;
Article article = new Article();
article.setId(1);
article.setTitle("好消息");
article.setAuthor("zhangsan");
article.setContent("Hello World");
//构建一个索引功能
Index index = new Index.Builder(article).index("atguigu").type("news").build();
try {
//执行
jestClient.execute(index);
} catch (IOException e) {
e.printStackTrace();
}
}
执行。查询一下。
搜索:
//测试搜索
@Test
public void search(){
//查询表达式
String json ="{\n" +
" \"query\" : {\n" +
" \"match\" : {\n" +
" \"content\" : \"hello\"\n" +
" }\n" +
" }\n" +
"}";
//更多操作:https://github.com/searchbox-io/Jest/tree/master/jest
//构建搜索功能
Search search = new Search.Builder(json).addIndex("atguigu").addType("news").build();
//执行
try {
SearchResult result = jestClient.execute(search);
System.out.println(result.getJsonString());
} catch (IOException e) {
e.printStackTrace();
}
}
接下来整合SpringDataElasticsearch
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
首先是注掉的jest解绑,留下jest。
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=192.168.244.130:9300
原理在jest模块
接下来我们看下参数。
nodes写上主机地址的9300端口。
报错,可知ES版本可能不合适,参照官方文档。
地址:https://spring.io/projects/spring-data-elasticsearch#learn
版本分析。
看下版本的关系。
和springboot一样
这个是3.1.6版本。和es的5版本适配是对的。
我这个没有报错的。版本不适配升级springboot版本和安装es。
讲的降低elasticsearch的版本了。
注意按照道理说是用docker装6.4.3的版本。
如何换接口如上。
启动:
看出添加传输节点。
如何使用看官方文档:https://github.com/spring-projects/spring-data-elasticsearch
编写一个 ElasticsearchRepository,这个是在官方文档里面建议的。
package com.atguigu.elastic.repository;
import com.atguigu.elastic.bean.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
//参照
// https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/
public List<Book> findByBookNameLike(String bookName);
}
注意继承关系就有其里面的所有的方法了。
写一个bean:
测试:
@Autowired
BookRepository bookRepository;
注入bookRepository
注意一点Book类上要标注上索引和类型。
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "atguigu",type = "book")
public class Book {
private Integer id;
private String bookName;
private String author;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", bookName='" + bookName + '\'' +
", author='" + author + '\'' +
'}';
}
}
@Test
public void test02(){
Book book = new Book();
book.setId(1);
book.setBookName("西游记");
book.setAuthor("吴承恩");
bookRepository.index(book);
//for (Book book : bookRepository.findByBookNameLike("游")) {
//System.out.println(book);
//}
}
测试。
查询下:报错,原因是虚拟机的elasticsearch的版本问题。
增删改查都在整个类里面写, 注意可以自定义自己的查询方法
package com.atguigu.elastic.repository;
import com.atguigu.elastic.bean.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
//参照
// https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/
public List<Book> findByBookNameLike(String bookName);
}
@Test
public void test02(){
//Book book = new Book();
//book.setId(1);
//book.setBookName("西游记");
//book.setAuthor("吴承恩");
//bookRepository.index(book);
for (Book book : bookRepository.findByBookNameLike("游")) {
System.out.println(book);
}
}
查询下,注意只写方法名即可。
参照官方文档:
或者注解:
github地址:
https://blog.csdn.net/qq_28764557/article/details/89279051