SpringBoot中對Elasticsearch的增刪改查操作
突然接到領導交給的一個搜索的專案,需要新增一個版本,后臺頁面資料是存放在ElasticSearch中的,由于之前在實際專案當中從未用過ES,再加上只給了兩天時間就需要完成頁面和介面的開發,所以顯得有些局促,不過好歹順利完成,將學到的ES使用記錄下來,
本文是通過spring-data-elasticsearch來操作ES的
引包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
/dependency>
物體類
想要操作ES中的索引是需要創建一個物體類
例如我所需要操作的是一個廣告類:
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
/**
* 廣告索引
*
*/
@Data
@Document(indexName = "adsInfos", type = "adsType", shards = 6, replicas = 2, refreshInterval = "0s")
public class Es_AdsInfo {
@Id
private Object id;
@Field
private Object adsName; //廣告圖名稱
@Field
private Object adsTypes; //廣告圖型別
@Field
private Object adsKeyWords;//匹配關鍵字
@Field
private Object adsStartTime;//推廣開始時間
@Field
private Object adsEndTime;//推廣結束時間
@Field
private Object adsPCImg;//PC端廣告圖地址
@Field
private Object adsMobileImg;//移動端廣告圖地址
@Field
private Object adsPCLink;//PC端跳轉地址
@Field
private Object adsMobileLink;//移動端跳轉地址
@Field
private Object addTime;//添加時間段
@Field
private Object insertDateTime; //入庫時間
@Field
private Object updateDateTime; //更新時間
@Field
private Object field1; //備用欄位
@Field
private Object field2; //備用欄位
@Field
private Object field3; //備用欄位
@Field
private Object field4; //備用欄位
@Field
private Object field5; //備用欄位
}
在物體類中可以看到有一個@Document注解,里面有indexName,type,shards,replicas,refreshInterval
@Document中各個引數解釋
事先宣告:ES中的索引類似于普通關系型資料庫(如:mysql,sqlserver)的資料庫,而ES中的type則相當于資料庫中的表,
- indexName 索引名稱 代表的是es中的具體某個索引
- type 索引型別 代表的是索引中某個type
- shards 分片數量 可以不要
- replicas 備份數量 可以不要
- refreshInterval 重繪間隔 可以不要
以上幾個引數必須要有indexName 和 type 其他三個可以不寫
比如可以這樣
@Document(indexName = "adsInfos", type = "adsType"")
使用ElasticsearchTemplate完成增刪改查操作
使用ElasticsearchTemplate完全不需要有Dao層和service層,直接controller附帶一個物體類就搞定一切,話不多說,上代碼,
查(分頁查詢,條件查詢)
/**
* 資料查找
*
* @return
*/
@RequestMapping(value = "getPageList", method = RequestMethod.GET)
public Page<Es_KuaiSou_AdsInfo> findPageList(@PageableDefault(size = 12) Pageable pageable, @RequestParam(name="title",required = false)String title) {
SortBuilder sortBuilder = SortBuilders.fieldSort("insertDateTime").order(SortOrder.DESC);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery()).withSort(sortBuilder).withPageable(pageable).build();
Page<Es_KuaiSou_AdsInfo> perfect_indices = elasticsearchTemplate.queryForPage(searchQuery, Es_KuaiSou_AdsInfo.class);
return perfect_indices;
}
完全沒有看錯,簡簡單單的三兩行代碼搞定查詢,
但需要注意一下幾點,如何使用條件查詢?排序?分頁查詢?
條件查詢
如果想要使用條件查詢的話只需要在NativeSearchQueryBuilder后點一個withQuery物件出來withQuery(欄位名,引數)
效果:
new NativeSearchQueryBuilder().withQuery(matchQuery("adsName","開屏廣告"))
這就是對adsName欄位進行篩選,查出adsName等于開屏廣告的資料
排序
想要按某個欄位排序的話就需要new一個SortBuilder物件
SortBuilder sortBuilder = SortBuilders.fieldSort("time").order(SortOrder.DESC);
創建完SortBuilder 物件以后再new NativeSearchQueryBuilder()后邊點一個withSort()把sortBuilder 物件放括號里
效果:
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withSort(sortBuilder).build();
分頁
因為ES默認只回傳10條資料,想要每頁多回傳幾條需要創建Pageable物件
比如我這里是在查詢方法加了注解@PageableDefault(size = 12) Pageable pageable,改為ES默認回傳12條資料,
效果:
SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable).build();
當所有查詢條件都就位之后效果是這樣的:
SortBuilder sortBuilder = SortBuilders.fieldSort("time").order(SortOrder.DESC);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("adsName","開屏廣告")).withSort(sortBuilder).withPageable(pageable).build();
然后再將SearchQuery 物件交給elasticsearchTemplate.queryForPage()
最終效果:
/**
* 資料查找
*
* @return
*/
@RequestMapping(value = "getPageList", method = RequestMethod.GET)
public Page<Es_AdsInfo> findPageList(@PageableDefault(size = 12) Pageable pageable, @RequestParam(name="adsName",required = false)String adsName) {
SortBuilder sortBuilder = SortBuilders.fieldSort("time").order(SortOrder.DESC);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("adsName",adsName).withSort(sortBuilder).withPageable(pageable).build();
Page<Es_AdsInfo> perfect_indices = elasticsearchTemplate.queryForPage(searchQuery, Es_AdsInfo.class);
return perfect_indices;
}
增改
這里增改在一個方法里實作了,當新增資料時生成的id在ES里查找不到就會新增一條資料,當修改的時候由于ES里已經存在一個一模一樣id的資料,此時就是對這條資料進行了修改,
/**
* 資料添加/修改
*
* @return
*/
@RequestMapping(value = "save", method = RequestMethod.POST)
public void save(@RequestBody Es_AdsInfo es_AdsInfo) throws IOException {
//修改資料
String id = UUID.randomUUID().toString();
if(null == es_AdsInfo.getId()){
es_AdsInfo.setId(id);
}
List<IndexQuery> queries = new ArrayList<>();
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(es_AdsInfo.getId().toString());
indexQuery.setObject(es_AdsInfo);
indexQuery.setIndexName("adsInfos");
indexQuery.setType("adsType");
queries.add(indexQuery);
elasticsearchTemplate.bulkIndex(queries);
}
洗掉
洗掉的話把id傳過來使用elasticsearchTemplate執行delete操作就可以了,
delete(“adsInfos”,“adsType”,id)
我們看到delete方法中有三個引數,分別為索引名稱,索引型別,和要洗掉資料的id,
/**
* 資料洗掉
*
* @return
*/
@RequestMapping(value = "deleted", method = RequestMethod.DELETE)
public void deleted(String id) {
elasticsearchTemplate.delete("adsInfos","adsType",id);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295362.html
標籤:其他
上一篇:Spark的RDD持久化
