本文只寫增刪改,關於查詢有點複雜,會在另一篇文章詳細概述
springboot是個好東西,嘖嘖
首先引入依賴
<!-- elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
然後再造個實體類
package com.study.elasticsearch;
import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "data", type = "table")
//indexName索引名稱 可以理解爲數據庫名 必須爲小寫 不然會報org.elasticsearch.indices.InvalidIndexNameException異常
//type類型 可以理解爲表名
public class Domain implements Serializable {
private static final long serialVersionUID = 1L;
@Id // 主鍵,注意這個搜索是id類型是string,與我們常用的不同
private String id; // @Id註解加上後,在Elasticsearch裏相應於該列就是主鍵了,在查詢時就可以直接用主鍵查詢
private String title;
private String createTime;
private String text;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
/**
*
* @param id
* @param title
* @param createTime
* @param text
*/
public Domain(String id, String title, String createTime, String text) {
super();
this.id = id;
this.title = title;
this.createTime = createTime;
this.text = text;
}
//不寫構造函數查詢會報錯
Domain() {
}
}
這裏說下實體類上的幾個註解
@Document註解裏面的幾個屬性,類比mysql的話是這樣:
indexName –> 索引庫的名稱,建議以項目的名稱命名,就相當於數據庫DB
type –> 類型,建議以實體的名稱命名Table ,就相當於數據庫中的表table
Document –> row 就相當於某一個具體對象
String indexName();//索引庫的名稱,建議以項目的名稱命名
String type() default "";//類型,建議以實體的名稱命名
short shards() default 5;//默認分區數
short replicas() default 1;//每個分區默認的備份數
String refreshInterval() default "1s";//刷新間隔
String indexStoreType() default "fs";//索引文件存儲類型
@Id註解
在Elasticsearch裏相應於該列就是主鍵了,在查詢時就可以直接用主鍵查詢
@Field註解
public @interface Field {
FieldType type() default FieldType.Auto;#自動檢測屬性的類型
FieldIndex index() default FieldIndex.analyzed;#默認情況下分詞
DateFormat format() default DateFormat.none;
String pattern() default "";
boolean store() default false;#默認情況下不存儲原文
String searchAnalyzer() default "";#指定字段搜索時使用的分詞器
String indexAnalyzer() default "";#指定字段建立索引時指定的分詞器
String[] ignoreFields() default {};#如果某個字段需要被忽略
boolean includeInParent() default false;
}
配置文件
#es的默認名稱,如果安裝es時沒有做特殊的操作名字都是此名稱,分佈式多節點用逗號分隔
spring.data.elasticsearch.cluster-name=elasticsearch
# Elasticsearch 集羣節點服務地址,用逗號分隔,如果沒有指定其他就啓動一個客戶端節點,默認java訪問端口9300
spring.data.elasticsearch.cluster-nodes=localhost:9300
# 設置連接超時時間
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s
springboot 爲ES封裝了一套jpa的操作
package com.study.elasticsearch;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface EsRepository extends ElasticsearchRepository<Domain,String> {
}
下面就是spring一貫作風了,jpa調用
package com.study.elasticsearch;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.study.utils.Date;
@RestController
public class EsController {
@Autowired
private EsRepository esRepository;
//新增
@GetMapping("save")
public Domain save(String txt) {
Domain Info = new Domain(Date.getDateyyyyMMdd(), "testTitle", Date.getDateyyyy_MM_dd(), txt);
Domain save = esRepository.save(Info);
return save;
}
//根據id刪除
@GetMapping("delete")
public String delete(String id) {
esRepository.deleteById(id);
return "success";
}
//這其實就是個新增,只不過同一個id會覆蓋
@GetMapping("update")
public Domain update(String id, String txt) {
Domain Info = new Domain(id, "NewTestTitle", Date.getDateyyyy_MM_dd(), txt);
Domain save = esRepository.save(Info);
return save;
}
}
啓動ES,然後再瀏覽器get訪問,增加數據