Spring Data Elasticsearch 是spring data對elasticsearch進行的封裝。
這里有兩種方式操作elasticsearch:
1、使用ElasticsearchRepository,即可使用內部封裝好的API,這種方式類似spring data jpa、的MongoDB
2、在項目中使用@Autowired注入ElasticsearchTemplate,然后完成相應操作。
1、使用ElasticsearchRepository方式
1)導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
這里要注意版本問題:
SpringDataElasticSearch與ES版本之間有相應的適配關系,低版本的SpringDataElasticSearch不兼容高版本的ES。解決方案:
1.升級SpringBoot版本
2.降級ES版本。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-X36rbias-1571406558370)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571402504012.png)]
2)application.yml
#配置spring-boot-starter-data-elasticsearch
data:
elasticsearch:
cluster-name: docker-cluster
cluster-nodes: 192.x.x:9300
3)實體類
這里介紹Spring Data通過注解來聲明字段的映射屬性,有下面的三個注解:
@Document 作用在類,標記實體類為文檔對象,一般有兩個屬性
indexName:對應索引庫名稱
type:對應在索引庫中的類型
shards:分片數量,默認5
replicas:副本數量,默認1
@Id 作用在成員變量,標記一個字段作為id主鍵
@Field 作用在成員變量,標記為文檔的字段,並指定字段映射屬性:
type:字段類型,是枚舉:FieldType,可以是text、long、short、date、integer、object等
text:存儲數據時候,會自動分詞,並生成索引
keyword:存儲數據時候,不會分詞建立索引
Numerical:數值類型,分兩類
基本數據類型:long、interger、short、byte、double、float、half_float
浮點數的高精度類型:scaled_float
需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子后存儲,取出時再還原。
Date:日期類型
elasticsearch可以對日期格式化為字符串存儲,但是建議我們存儲為毫秒值,存儲為long,節省空間。
index:是否索引,布爾類型,默認是true
store:是否存儲,布爾類型,默認是false
analyzer:分詞器名稱,這里的ik_max_word即使用ik分詞器
@Document(indexName = "jiatp",type = "book")
public class Book {
private Integer id;
private String bookName;
private String author;
public Book() {
}
public Book(Integer id, String bookName, String author) {
this.id = id;
this.bookName = bookName;
this.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;
}
}
4)自定義BookRespository接口
package com.jiatp.elasticsearch.respository;
import com.jiatp.elasticsearch.bean.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
import java.util.List;
public interface BookRespository extends ElasticsearchRepository<Book,Integer> {
public List<Book> findByBookNameLike(String bookName);
}
spring-data-elasticsearch支持方法內的關鍵字名稱
https://docs.spring.io/spring-data/elasticsearch/docs/3.2.0.RELEASE/reference/html/#elasticsearch.query-methods
5)測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot03ElasticsearchApplicationTests {
//自動注入jest
@Autowired
BookRespository bookRespository;
@Test
public void TestRespository(){
// Book book = new Book();
// book.setId(1);
// book.setBookName("西游記");
// book.setAuthor("吳晨恩");
// bookRespository.index(book);
//
List<Book> lists = bookRespository.findByBookNameLike("游");
for(Book bk :
lists) {
System.out.println(bk.getBookName());
}
}
2、使用ElasticsearchTemplate
配置如上
測試:
@Autowired
ElasticsearchTemplate elt;
@Test
public void testElasticsearchTemp() throws Exception{
Client client = elt.getClient();
XContentBuilder builder = jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject();
IndexResponse response = client.prepareIndex("people", "_doc", "1")
.setSource(builder).get();
System.out.println(response.getIndex());
其他測試請查看官方文檔:
https://www.elastic.co/guide/en/elasticsearch/client/java-api/7.4/java-docs-index.html