java springboot與elasticsearch結合以及elasticsearch增刪改查例項
上一篇中,我們為同學們講解了如何安裝elasticsearch(下面簡稱es),如果還沒有es環境的同學,可以閱讀Linux 安裝Elasticsearch和配置ik分詞器步驟 來將es的環境先都準備好,今天我們要做的是將es融入到我們的java專案中,還是一如既往,我們還是使用springboot來建立一個專案。好了。廢話不多說,上流程。
1.使用場景
我們在什麼情況下會使用到es?搜尋引擎當然是搜尋的時候啦,一般在電商專案中,我們如果要按照分類或者關鍵字去搜索某些商品並且關鍵字還需要有一定的智慧性(也就是能根據你的關鍵字找到關聯商品)的話,我們總不能去資料庫使用like來解決這種需求吧。
首先效能方面,每次都去查資料庫本來效率上就是不高的,不然也就不會出現redis、solr或者es這類技術了,雖說有索引,但也是有一定的效率上的瓶頸的。
其次 like也無法滿足我們所謂的智慧性這個需求,你總不能說我把拿到的關鍵字再自己進行拆分吧,這就會面臨這如何分詞的問題。
考慮到以上的這些問題,此時我們的es閃亮登場了,es的效率自然是沒話說,關於分詞,雖然他本身自帶的分詞器並不是很理想,但是在之前的文章中,我們也配置了ik分詞器,所以此情此景下,自然是使用es是明智的選擇。
那麼我們到底該如何將es融入到我們的springboot專案並且如何使用api對es進行增刪改查的一系列操作呢?
2.建立專案(準備工作)
2.1 建立一個springboot專案
本次內容的重點在於es,因此不在建立springboot的專案和一些配置上浪費過多的時間了,只做簡單的截圖,如果有不清楚的同學,可以檢視此篇文章來看如何建立一個springboot專案 java 搭建基於springboot的ssh(spring + springmvc + hibernate)的gradle專案(基礎篇)
2.2 配置es
2.2.1 引入gradle依賴
首先我們需要引入es的jar包,在build.gradle中新增依賴
//搜尋包
compile(‘org.springframework.boot:spring-boot-starter-data-elasticsearch’)
2.2.2 配置遠端連線es地址
其次,我們需要配置es需要遠端連線的地址,在application.properties配置檔案中新增如下配置
#es的預設名稱,如果安裝es時沒有做特殊的操作名字都是此名稱
spring.data.elasticsearch.cluster-name=elasticsearch
#連線的遠端地址,埠號一定要是9300,不要寫成9200
spring.data.elasticsearch.cluster-nodes=你的ip:9300
management.health.elasticsearch.enabled=false
2.2.3 拿連線了es的物件
配置都配置好了我們該如何拿到連線了此es的實體物件呢
為了規範,我們先將三層架構的層次分出來,如下圖所示。
1.首先在search的entity中建立MyEsEntity類,具體內容如下
package com.beyondli.search.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* Created by beyondLi
* Date 2017/11/21
* Desc .
*/
//lombok註解(可自己手動建立getset以及有參無參構造來代替)
@Data
@NoArgsConstructor
@AllArgsConstructor
//es註解,設定索引名稱以及型別
@Document(indexName = "myes", type = "info")
public class MyEsEntity {
//id(需要新增@Id註解,或會自動識別名稱為id的欄位為id,其餘欄位沒有限制)
@Id
private Integer id;
//名稱
private String name;
//性別
private String sex;
//年齡
private Integer age;
}
2.建立MyEsRepository介面來繼承ElasticsearchRepository從而達到拿到連線es的實體類的目的,具體內容如下
package com.beyondli.search;
import com.beyondli.search.entity.MyEsEntity;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
* Created by beyondLi
* Date 2017/11/21
* Desc es的介面
*/
//MyEsEntity為要存的資料的型別,Integer為@id的型別
public interface MyEsRepository extends ElasticsearchRepository<MyEsEntity, Integer> {
}
3.es實現增刪改查
好了,前期的準備工作已經完成了,現在我們開始對es進行增刪改查操作,具體程式碼解釋都會放到註釋中,請各位同學仔細閱讀。
3.1 新增
rest層
package com.beyondli.rest;
import com.beyondli.search.entity.MyEsEntity;
import com.beyondli.service.EsTestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by beyondLi
* Date 2017/11/21
* Desc .
*/
@RestController
@RequestMapping(value = "/es/test")
public class EsTest {
@Resource
EsTestService esTestService;
@RequestMapping(value = "/add")
public void add() {
//建立類
MyEsEntity myEsEntity = new MyEsEntity();
myEsEntity.setId(1);
//為了後期顯示出ik分詞器的效果,名字起了一個商品的名稱
myEsEntity.setName("五常大米");
myEsEntity.setSex("man");
myEsEntity.setAge(18);
esTestService.add(myEsEntity);
}
}
service層
package com.beyondli.service;
import com.beyondli.search.MyEsRepository;
import com.beyondli.search.entity.MyEsEntity;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by beyondLi
* Date 2017/11/21
* Desc .
*/
@Service
public class EsTestServiceImpl implements EsTestService {
@Resource
MyEsRepository myEsRepository;
/**
* 新增
* @param myEsEntity
*/
@Override
public void add(MyEsEntity myEsEntity) {
myEsRepository.save(myEsEntity);
}
}
好了,新增就是如此的容易,因為我們的MyEsRepository 繼承了es的ElasticsearchRepository類,所以自帶了增刪改查的aip,我們只要按照其aip規範進行操作即可。
我們來執行一下該介面,效果如下,資料成功新增到es中
3.2 刪除
我們來根據id進行刪除操作
rest層
@RequestMapping(value = "/delete")
public void delete() {
esTestService.delete();
}
service層
/**
* 刪除
*/
@Override
public void delete() {
//根據id,或者傳入查到的entity物件也可以
myEsRepository.delete(1);
}
執行結果
3.3 修改
其實修改的思路 是先將資料查出,然後再呼叫save也就是儲存操作,根據id將其資料覆蓋掉即可,所以你會發現aip中並沒有類似於update的方法,因為不存在新的aip,所以就不提供demo了,相信各位同學一定是可以舉一反三的按照上面的思路來解決修改這個問題的。
3.4查詢
重頭戲!重頭戲!我們為了什麼才加的搜尋引擎? 查詢!!!現在才是重點,相信使用過JPA的同學接受查詢這些aip的操作和思路的時候一定會特別順手特別的快。
es對查詢的操作個人感覺支援的還是非常好的,包括模糊查詢、排序、分頁等等等一般sql能想到的需求你會發現他都有支援的api,好了廢話不多說,上demo。
我們先新增一些資料到es中為了我們一會能展現更多的操作,如圖所示
我們現在的需求是根據五常米搜尋出所有名稱帶五常和米字的資訊並且性別為man年齡從高到底排序且進行一頁顯示二條的分頁操作
rest層
@RequestMapping(value = "/select")
public List<MyEsEntity> select() {
List<MyEsEntity> myEsEntity = esTestService.select();
return myEsEntity;
}
service層(重點)
public List<MyEsEntity> select() {
//建立builder
BoolQueryBuilder builder = QueryBuilders.boolQuery();
//builder下有must、should以及mustNot 相當於sql中的and、or以及not
//設定模糊搜尋
builder.must(QueryBuilders.fuzzyQuery("name", "五常米"));
//設定性別必須為man
builder.must(new QueryStringQueryBuilder("man").field("sex"));
//按照年齡從高到低
FieldSortBuilder sort = SortBuilders.fieldSort("age").order(SortOrder.DESC);
//設定分頁(拿第一頁,一頁顯示兩條)
//注意!es的分頁api是從第0頁開始的(坑)
PageRequest page = new PageRequest(0, 2);
//構建查詢
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//將搜尋條件設定到構建中
nativeSearchQueryBuilder.withQuery(builder);
//將分頁設定到構建中
nativeSearchQueryBuilder.withPageable(page);
//將排序設定到構建中
nativeSearchQueryBuilder.withSort(sort);
//生產NativeSearchQuery
NativeSearchQuery query = nativeSearchQueryBuilder.build();
//執行
Page<MyEsEntity> search = myEsRepository.search(query);
//獲取總條數(前端分頁需要使用)
int total = (int) search.getTotalElements();
//獲取查詢到的資料內容
List<MyEsEntity> content = search.getContent();
//為了方便我就不顯示總條數了,只在控制檯給各位同學列印總條數看一下了
System.out.println(total);
return content;
查詢結果如下
查詢結果
分頁總條數
好了,以上就是springboot結合es的一些基本操作api,靈活運用已經可以完成大部分的需求,希望可以對各位同學有所幫助。
原始碼地址獻上
http://download.csdn.net/download/liboyang71/10127429