Spring Boot 集成 ElasticSearch,實現(xiàn)高性能搜索
1、ElasticSearch介紹
Elasticsearch 是java開發(fā)的,基于 Lucene 的搜索引擎。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful Web接口。Elasticsearch 可以快速有效地存儲,搜索和分析大量數(shù)據(jù),而且在處理半結構化數(shù)據(jù)(即自然語言)時特別有用。
應用集成Elasticsearch有4種方式:
REST Client Jest Spring Data Spring Data Elasticsearch Repositories
本文主要介紹一下用Spring Data Elasticsearch Repositories 是如何使用的。該方式與spring boot高度集成,日常開發(fā)時較方便,只需要簡單的配置即可開箱使用。
2、運行 Elasticsearch
為了便于測試,我們使用 Docker 鏡像方式快速部署一個單節(jié)點的 Elasticsearch實例,容器啟動時并綁定宿主機的9200和9300端口
拉取鏡像:
docker pull elasticsearch:7.4.2
查看鏡像:
docker images
創(chuàng)建宿主機掛載目錄:
mkdir -p /mydata/elasticsearch/config/
mkdir -p /mydata/elasticsearch/data/
echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml
運行容器:
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e ES_JAVA_OPS="-Xms256m -Xmx256m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
參數(shù)說明:
-p 9200:9200 將容器的9200端口映射到主機的9200端口;
--name elasticsearch 給當前啟動的容器取名叫 elasticsearch
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data 將數(shù)據(jù)文件夾掛載到主機; -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 將配置文件掛載到主機;
-d 以后臺方式運行(daemon)
-e ES_JAVA_OPS="-Xms256m -Xmx256m" 測試時限定內存小一點
查看容器進程:
docker ps -a
3、項目集成
按照Spring Boot的慣例,我們不必在上下文中提供任何bean來啟用對Elasticsearch的支持。我們只需要在pom.xml中添加以下依賴項:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
由于spring-boot-starter-parent指定的版本號是2.2.1.RELEASE,所以上面引入的兩個starter組件會被強制一樣的版本號,便于統(tǒng)一化管理。而底層引入的 spring-data-elasticsearch 是3.2.1.RELEASE
在配置文件 application.yml 中配置 ES 的相關參數(shù),應用程序嘗試在localhost上與Elasticsearch連接,具體內容如下:
spring:
application:
name: spring-boot-bulking-elasticsearch
elasticsearch:
rest:
uris: 127.0.0.1:9200
read-timeout: 5s
Spring Boot 操作 ES 數(shù)據(jù)有三種方式:
實現(xiàn) ElasticsearchRepository 接口 引入 ElasticsearchRestTemplate 引入 ElasticsearchOperations
使用Spring Data Elasticsearch Repositories操作 Elasticsearch,定義實體類,并設置對應的索引名
@Document(indexName = "order", type = "biz1", shards = 2)
public class OrderModel {
@Id
private Long orderId;
private Double amount;
private Long buyerUid;
private String shippingAddress;
}
常用注解說明:
@Document:表示映射到Elasticsearch文檔上的領域對象
@Id:表示是文檔的id,文檔可以認為是mysql中表行的概念
@Filed:文檔中字段的類型、是否建立倒排索引、是否進行存儲
OrderModel表示訂單的索引模型,一個OrderModel對象表示一條ES索引記錄。如果用關系數(shù)據(jù)庫做參照,Index相當于表,Document相當于記錄
然后,需要自己定義一個業(yè)務接口 OrderRepository,并繼承擴展接口 ElasticsearchRepository
public interface OrderRepository extends ElasticsearchRepository<OrderModel, Long> {
}
ElasticsearchRepository 是 Spring boot Elasticsearch 框架預留的擴展接口,內部的類依賴關系如下圖所示:

ElasticsearchRepository 接口內提供常用的操作ES的方法,如:新增、修改、刪除、各種維度條件查詢及分頁等,詳細方法內容如下:

save() 方法是創(chuàng)建索引,如果索引document已經存在,后面的
save方法則是對之前的數(shù)據(jù)覆蓋。也就是說新增和修改都可以通過save方法 實現(xiàn)。
最后,通過編寫單元測試類來驗證方法功能
@Test
public void test1() {
OrderModel orderModel = OrderModel.builder()
.orderId(1L)
.amount(25.5)
.buyerUid(13201L)
.shippingAddress("上海")
.build();
orderModel = orderRepository.save(orderModel);
System.out.println(orderModel);
}
@Test
public void test2() {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder);
List<OrderModel> orderDocumentList = orderRepository.search(searchQueryBuilder.build()).getContent();
System.out.println(JSON.toJSONString(orderDocumentList));
}
使用這個OrderRepository 來操作 ES 中的 OrderModel 數(shù)據(jù)。我們這里并沒有手動創(chuàng)建OrderModel 對應的索引,由 elasticsearch 默認生成。
4、kibana 可視化控制臺
安裝 kibana,比較簡單,這里就不在累述了。先下載kibana安裝包,再解壓
# bin目錄下,執(zhí)行啟動腳本
./kibana
瀏覽器訪問:http://localhost:5601/app/kibana#/dev_tools/console?_g=()
可以看到剛才執(zhí)行單元測試,創(chuàng)建的索引記錄。

5、項目源碼地址
https://github.com/aalansehaiyang/spring-boot-bulking
模塊:spring-boot-bulking-elasticsearch
歡迎關注微信公眾號:互聯(lián)網全棧架構,收取更多有價值的信息。
