What —— Elasticsearch是什么?
Elasticsearch是一個基於Lucene的搜索服務器,Elasticsearch也是使用Java編寫的,它的內部使用Lucene做索引與搜索,但是它的目的是使用全文檢索變得簡單,通過隱藏Lucene的復雜性,取而代之的提供一套簡單一致的RESTful API。
Elasticsearch 不僅僅是 Lucene,並且也不僅僅只是一個全文搜索引擎。 它可以被下面這樣准確的形容:
- 一個分布式的實時文檔存儲,每個字段 可以被索引與搜索
- 一個分布式實時分析搜索引擎
- 能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據
面向文檔
Elasticsearch是面向文檔,即文檔是可以被索引的信息的基本單位,而文檔的格式是在NoSQL中常用的JSON,關於關系型數據庫和Elasticsearch之間一些名詞的關系的對應可以用以下的表格來表示,方便我們后面的應用:
關系型數據庫 | Elasticsearch |
---|---|
Database | Index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
這里需要注意的是文檔的格式不是固定的,同一個Type下的不同文檔可以擁有不同的格式
Why —— 為什么選擇Elasticsearch?
-
豐富的查詢方式——Elasticsearch能夠執行及合並多種類型的搜索(結構化數據、非結構化數據、地理位置、指標),搜索方式隨心而變。
-
極速的查詢速度——Elasticsearch通過有限狀態轉換器實現了用於全文檢索的倒排索引,實現了用於存儲數值數據和地理位置數據的 BKD 樹,以及用於分析的列存儲。每個數據都被編入了索引。
-
可觀的可擴展性——Elasticsearch能夠水平擴展,每秒鍾可處理海量事件,同時能夠自動管理索引和查詢在集群中的分布方式,可以在承載了 PB 級數據的成百上千台服務器上運行。
-
強大的彈性保障——硬件故障。網絡分割。Elasticsearch 檢測這些故障並確保集群(和數據)的安全性和可用性。通過跨集群復制功能,輔助集群可以作為熱備份隨時投入使用。
How —— 如何在Spring Boot實戰中使用Elasticsearch?
安裝Elasticsearch
https://www.elastic.co/cn/downloads/elasticsearch
這里我們選擇的是6.2.2版本的ES,因為我在spring-data-elasticsearch的github上看到最新版本的支持的ES是6.2.2
其中3.2.x版本尚未發布正式版,所以這里選擇了最新的3.1.8版本,下面我們切換到安裝目錄的bin目錄下,啟動es:
./elasticsearch &
這里添加 & 符號的作用是讓它在后台運行。
看到這個就說明啟動成功了~
安裝中文分詞器iK
因為,在我們日常的應用中,我們用的比較多的都是中文的分詞,所以這里我們需要一個中文的分詞器
首先前往github上下載與ES版本對應的zip包
https://github.com/medcl/elasticsearch-analysis-ik/releases
然后在es的安裝目錄下的plugins下新建一個ik的目錄,將zip包解壓到該目錄下重啟es即可~
在es的啟動日志中看到這個說明插件已經安裝並啟動成功!
到這里,我們的前期准備工作就已經結束了,下面的就是在Spring Boot項目中進行操作了~
添加pom依賴
我們首先在pom.xml中添加spring-data-elasticsearch的依賴(敲黑板!!這里的版本一定要去參考一下對應的ES的版本,不然就會引起版本兼容性問題而報錯!):
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.1.8.RELEASE</version>
</dependency>
依賴已經添加完畢,下面我們就通過簡單的配置來完成CRUD
CRUD
這里的配置需要注意一個點,我們訪問的9200是HTTP的端口號,而使用Java的時候需要配置成9300:
spring:
data:
elasticsearch:
cluster-name: my-applicatioon
cluster-nodes: 127.0.0.1:9300
在啟動日志中,我們可以看到這一點:
然后我們通過注解來完成一個index和mapping的創建(即對應關系型數據庫中的庫和表)
@Data
@Document(indexName = "test",type = "article")
public class Article implements Serializable {
private Long id;
@Field(type= FieldType.Text,analyzer = "ik_max_word")
private String title;
private String content;
}
@Filed
注解中的屬性可以對分詞器進行配置analyzer = "ik_max_word"
,這樣就可以在查詢標題的時候使我們的中文分詞器了~
這樣,我們就創建了一個index(database)名為test,並新建一個type(table)名為article。
下面,我們如果想要完成CRUD,只需要創建一個接口去繼承ElasticsearchRepository
即可,如下:
public interface ESDao extends ElasticsearchRepository<Article,Long> {
}
然后,我們就可以在我們項目這樣去用了~
和JPA一樣方便,我們這時就可以把ES當做MySQL去操作即可~
項目中用到的對應版本的包我已經上傳到了百度網盤,關注公眾號回復“ES”即可獲取。
完整的Demo代碼我已經上傳到了github,歡迎fork star pr
原創不易,謝謝支持!