知識儲備: html
關於ElasticSearch的基本使用我已經在上一篇文章介紹過了(傳送門),本篇文章主要講述的是SpringBoot與ElasticSearch的整合使用。node
SpringBoot與ElasticSearch的整合git
一.Jest的使用github
1.1 Jest默認不生效,須要導入Jest的工具包:spring
<dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>5.3.3</version> </dependency>
1.2 默認鏈接的主機地址是localhost,若不是部署在本地的話須要配置主機地址docker
spring.elasticsearch.jest.uris=http://172.**.**.**:9200
1.3 建立須要操做的實體類json
public class People { @JestId //注意要給id加上註解 private Integer id; private String name; private Integer age; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "People{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
1.4 測試:給ES中的索引保存一個文檔elasticsearch
@Autowired JestClient jestClient; //SpringBoot已經給咱們自動配置好了,能夠直接引用 @Test public void contextLoads() { //1,給ES中的索引保存一個文檔 People people = new People(); people.setId(1); people.setAge(22); people.setGender("男"); people.setName("王鑫"); //構建一個索引功能 Index index = new Index.Builder(people).index("school").type("qinghua").build(); try { jestClient.execute(index); } catch (IOException e) { e.printStackTrace(); } }
1.5 測試:構建搜索功能ide
@Test public void search(){ //查詢表達式 String json = "{\n" + " \"query\" : {\n" + " \"match\" : {\n" + " \"name\" : \"王\"\n" + " }\n" + " }\n" + "}"; //構建搜索功能 Search search = new Search.Builder(json).addIndex("school").addType("qinghua").build(); try { SearchResult result = jestClient.execute(search); System.out.println(result.getJsonString()); } catch (IOException e) { e.printStackTrace(); } }
這裏只是給出幾個簡單的演示,更多的能夠詳細參考Jest的官方文檔。工具
二.SpringData ElasticSearch的使用
在使用SpringData ElasticSearch前有個問題須要關注一下,就是版本問題,我一開始用的是ES的最新版,SpringBoot2.x的版本,可是一直報錯。因此通過幾番測試我仍是將SpringBoot版本將爲1.5.6版本,並用docker從新安裝了2.4.6版本的ES。
2.1 配置節點名稱,端口
SpringData ElasticSearch採用的是TCP通訊,用的是9300端口。
spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=***.**.**.**:9300 spring.data.elasticsearch.repositories.enabled=true
2.2 建立實體類,配置索引信息
package com.wang.elasticsearch.bean; import org.springframework.data.elasticsearch.annotations.Document; @Document(indexName = "xinhua",type = "book") //這邊要配置索引信息 public class Book { private Integer id; private String bookname; private String author; @Override public String toString() { return "Book{" + "id=" + id + ", bookname='" + bookname + '\'' + ", author='" + 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; } }
2.3 編寫一個ElasticsearchRepository
/** * 泛型的類型爲<實體類,索引主鍵類型> */ public interface BookRepository extends ElasticsearchRepository<Book,Integer> { }
2.4 建立一個索引
@Test public void Booksave(){ Book book = new Book(); book.setId(1); book.setBookname("Java開發"); book.setAuthor("Wang"); bookRepository.index(book); }
2.5 自定義ElasticsearchRepository方法
ElasticsearchRepository提供有不少自帶的方法,可以知足不少開發需求,固然也能夠擴展本身的方法,擴展方法只須要給個方法名就能夠了,不過要注意方法名稱要符合規範。
/** * 泛型的類型爲<實體類,索引類型> */ public interface BookRepository extends ElasticsearchRepository<Book,Integer> { /** * 這邊的方法名要注意和屬性名對應,Book的屬性名爲bookname,對應的方法名中的屬性爲Bookname而不是BookName * @param bookname * @return */ public List<Book> findByBooknameLike(String bookname); }
@Test public void Bookfind(){ for (Book book: bookRepository.findByBooknameLike("開")){ System.out.println(book); } }