这里是一个学习过程笔记的汇总:Spring Boot学习汇总
这节的学习,我们首先得了解什么是Elasticsearch,并会简单实用,关于这一块,直接去看es的官方文档即可,非常详细,极力推荐: es权威指南-中文版
大概了解了es之后,下面就开始我们今天的学习,首先快速创建一个springboot项目,添加web和es模块即可。
首先我们本地需要安装es,然后启动,启动好之后,浏览器输入:http://localhost:9200/
若出现如下信息,这说明es启动成功。
返回信息中的number:2.3.2 就是你的es的版本号。
接下来直接启动项目,也是直接启动成功,我们并没有配置任何的es相关信息,但一样启动成功,说明只要引入了相关模块,es就有相应的默认配置。
我们看一下pom文件,引入es模块后,导了如下包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
Spring Boot默认是支持两种方式和es交互:
1、SpringData Elasticsearch
这是一个默认生效的,即上面默认导入的jar包
2、Jest
默认不生效,将自动导入的spring-boot-starter-data-elasticsearch包注释,导入如下io.searchbox.jest包,即可生效。
es用的是哪个版本,导的包就是哪个版本,若es是2.3.2,那么导包就导2.x.x的版本即可
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>2.4.0</version>
</dependency>
Jest测试:
1、修改pom文件,注释掉原来的spring-boot-starter-data-elasticsearch包,加入io.searchbox.jest包
2、创建Article类
package com.example.springbootelasticsearch.domain;
import io.searchbox.annotations.JestId;
/**
* @author pavel
* @date 2018/12/10 0010
*/
public class Article {
@JestId
private Integer id;
private String author;
private String title;
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
3、测试
3.1、给es中索引(保存)一个文档
package com.example.springbootelasticsearch;
import com.example.springbootelasticsearch.domain.Article;
import io.searchbox.client.JestClient;
import io.searchbox.core.Index;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootElasticsearchApplicationTests {
/**
* 和es交互
*/
@Autowired
private JestClient jestClient;
@Test
public void contextLoads() {
// 给es中索引(保存)一个文档
Article article = new Article();
article.setId(1);
article.setTitle("good news");
article.setAuthor("zhangsan");
article.setContent("hello word");
// 创建一个索引 索引名为:west-lake 类型名为:news 文档为:article对象
Index index = new Index.Builder(article).index("west-lake").type("news").build();
try {
// 执行
jestClient.execute(index);
} catch (IOException e) {
e.printStackTrace();
}
}
}
直接运行,控制台无报错,然后postman(一个模拟http请求的工具,自行百度)访问:http://localhost:9200/west-lake/news/1
这个就是刚才索引到es的article文档。
测试搜索,这个得加搜索条件,我们就用官方文档中的添加查询表达式,json格式的:
// 测试搜索
public void getArticle() {
// 查找作者叫 zhangsan的
String json = "{\n" +
" \"query\" : {\n" +
" \"match\" : {\n" +
" \"author\" : \"zhangsan\"\n" +
" }\n" +
" }\n" +
"}";
Search search = new Search.Builder(json).addIndex("west-lack").addType("news").build();
try {
SearchResult result = jestClient.execute(search);
// 打印一个搜索结果的json串
System.out.println(result.getJsonString());
} catch (IOException e) {
e.printStackTrace();
}
}
运行,看控制台输出:
搜索完成。
剩下的功能可以自己根据前面给出的官方文档来测试一下。
SpringData Elasticsearch测试:
我们先看一下这块的源码:
看下这个自动配置文件
再看下配置参数类ElasticsearchProperties:
可见需要配置clusterName和clusterNodes,clusterName有默认值,下面看一下具体操作。
1、修改pom,放开导入es模块的自动导入的包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2、修改主配置类Application.properties,增加如下配置:
spring.data.elasticsearch.cluster-nodes=http://localhost:9300
3、启动项目
4、有两种方式和es进行交互:
4.1、编写一个ElasticsearchRepository的子接口来操作es
4.2、ElasticsearchTemplate操作es
这里就测试编写一个ElasticsearchRepository的子接口来操作es
编写一个Book实体类:
package com.example.springbootelasticsearch.domain;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author pavel
* @date 2018/12/10 0010
*/
// 表明索引名称以及类型名称(没有回自动创建)
@Document(indexName = "west-lake",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 + '\'' +
'}';
}
}
编写BookRepository接口,继承ElasticsearchRepository接口
package com.example.springbootelasticsearch.repository;
import com.example.springbootelasticsearch.domain.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
* @author pavel
* @date 2018/12/10 0010
*/
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
}
我们可以看一下ElasticsearchRepository接口:
这个接口又继承自ElasticsearchCrudRepository接口,简介的继承了CrudRepository接口,如下:
这里是一堆的增删改查方法,所以说,我们这里继承了ElasticsearchRepository接口后,就拥有了该对象的增删改查方法,就类似于之前讲的jpa中的dao继承了JpaRepository接口,就拥有了增删改查方法。
测试代码如下:
@Autowired
private BookRepository bookRepository;
@Test
public void test02() {
Book book = new Book();
book.setId(2);
book.setAuthor("大冰");
book.setBookName("《他们最幸福》,《乖,摸摸头》,《阿弥陀佛么么哒》,《好吗好的》,《我不》,《你坏》");
bookRepository.index(book);
}
直接运行,报错:
查询了一下,这个是因为,spring-data导入的elasticsearch包版本和本地启动的es版本不匹配,
我启动的es是2.3.2,而spring-data导入的却是3.1.3
官网上给的正确匹配结果是:
所以有两种解决方案:1,将本地es升级到6以上版本, 2、重新导入2.x.x版本的spring-data-elasticsearch包
我就直接重新下载一个6以上版本的es好了,下载好之后启动,然后再访问:
下面在BookRepository中自定义一个方法进行查询。
package com.example.springbootelasticsearch.repository;
import com.example.springbootelasticsearch.domain.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
/**
* @author pavel
* @date 2018/12/10 0010
*/
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
List<Book> findByBookNameLike(String bookName);
}
测试:
@Test
public void test03() {
List<Book> bookList = bookRepository.findByBookNameLike("《他们最幸福》");
for (Book book : bookList) {
System.out.println(book.toString());
}
}
运行,控制台输出:
还有一些方法,都可以试一下,自己来搞吧。