【Elasticsearch 搜尋之路】(一)什麼是 Elasticsearch?
本篇文章對 Elasticsearch 做了基本介紹,在後續將通過專欄的方式持續更新,本系列以 Elasticsearch7 作為主要的講解版本,歡迎各位大佬指正,共同學習進步!
一般涉及大型資料庫的電子商務和搜尋引擎的產品都面臨這樣一個問題,產品資訊檢索花費時間太長。這不良的使用者體驗,可能導致失去潛在的客戶。這種滯後搜尋歸因於產品設計所使用到關係資料庫,資料分散在多個表中,關係型資料處理這些表中資料獲取搜尋結果時工作速度是遠遠不能瞞足。可以說,現在的企業正在尋找資料儲存的替代品,以期促進快速檢索,而 Elasticsearch(ES)的出現很好解決這些問題。
1、什麼是 Elasticsearch?
Elasticsearch 是基於 Lucene 的搜尋引擎。它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful Web介面。
換句話說,Elasticsearch 是用 Java 開發的開源,獨立資料庫伺服器。基本上,它用於全文搜尋和分析。它從各種來源獲取資料,並將其儲存為針對搜尋進行了高度優化的複雜格式。如上所述,Elasticsearch 將 Apache Lucene 作為搜尋的核心。由於 Lucene 只是一個庫,使用起來有一定難度。但是你不必擔心,Elasticsearch 對搜尋引擎操作都進行封裝 ,可以通過使用對應的 Restful 的 API 進行操作。使用 Elasticsearch 可以快速有效地儲存,搜尋和分析大量資料,而且在處理半結構化資料(即自然語言)時特別有用。
2、Elasticsearch 能做什麼?
平時我們在 GitHub 上進行搜尋的時候,Github 不僅可以幫我們找到相隔的程式碼產庫,還可以幫助實現程式碼級的搜尋及搜尋詞的高亮的顯示,。當你在網上購物的時候,它也可以幫助你做商品的推薦。當你下班的時候,Elasticsearch 可以幫助你定位附件的乘客和司機,幫助平臺優化排程,除了搜尋,結合 Kibana、Logstash、Beats 的 ELK(Elastic Stack) 還被廣泛使用在大資料近實時分析的領域,包括了日誌分析、指標監控、資訊保安等多個領域,它可以幫助你探索海量的、結構化的、非結構化的資料,按需建立是視覺化報表,對監控資料設定報警閥值。
3、Elasticsearch 5、6、7版本特性史
V5.x
- Lucene 6.x,
- 效能提升,預設打分機制從 TF-IDF 改為 BM 25
- 支援 Ingest 節點、 Completion suggested 、Java REST 客戶端
- Type 標記成 deprecated,支援了 Keyword 的型別
- 效能優化
- 減少了內部爭競爭,防止對同一文件進行併發更新的競爭以及在同步事務日誌時減少了鎖定要求,索引吞吐量已得到了極大的提高
- Instant Aggregations,在 Shard 層面提供了 Aggregation 快取
- 新增了 Profile API
V6.x
- Lucene 7.x
- Removal of types,在 6.0 裡面,開始不支援一個 index 裡面存在多個 type
- 跨多個Elasticsearch叢集搜尋,保留原來的索引在 5.x 群集,跨群集搜尋來同時搜尋 6.x 和 5.x 群集
- 跨群集複製(CCR)
- 更友好的的升級及資料遷移,在主要版本之間的遷移更為簡化,體驗升級
- 效能優化
- 稀疏區域改進,降低了儲存成本
- 通過索引排序,可加快排序的查詢效能
V7.x
- Lucene 8.0
- 重大改進-正式廢除單個索引下多 Type 的支援
- 7.1開始,Security 功能免費使用
- ECK,允許使用者在 Kubernetes 上配置,管理和操作 Elasticsearch 叢集
- TransportClient 被廢棄
以至於,ES7 的 Java 程式碼,只能使用 restclient - 新功能
- 新的叢集協調
- 功能更完善的 REST Client
- Script Score Query,下一代的評分方式
- 效能優化
- 預設的 Primary Shard 數從 5 改為 1,避免 Over Sharding
- 效能優化,更快的 Top K 檢索
4、Elasticsearch 基本概念
要了解 Elasticsearch ,首先要先了解下面的幾個專有名詞,索引(Index)、文件( Document)、型別(Type)
索引(Index)
- Index 一索引是文件的容器,是一類文件的結合
- Index 體現了邏輯空間的概念:每個索引都有自己的 Mapping,用於定義包含的文件的欄位名和欄位型別
- Shard 體現了物理空間的概念:索引中的資料分散在 Shard 上
- 索引的 Mapping 與 Settings
- Mapping 定義文件欄位的型別
- Setting 定義不同的資料分佈
定義不同的資料分佈
{
"movies" : {
"settings" : {
"index" : {
"creation_date" : "1570452552",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "pB0UsxjfQT2fW-s8Uy-Nsg",
"version" : {
"created" : "2030599"
}
}
}
}
}
定義文件欄位的型別
{
"movie": {
"mappings": {
"doc": {
"properties": {
"songName": {
"type": "text"
},
"singer": {
"type": "text"
},
"price": {
"type": "integer"
}
}
}
}
}
}
索引有不同語義,在 ES 中指的是在叢集中建立的索引(名詞),也可以指的是文件到 ES 的過程(動詞),即是一次倒排索引的過程。而在其他地方看到索引更多表示 B 樹索引或者倒排索引。
文件( Document)
- Elasticsearch 是面向文件的,文件是所有可搜尋資料的最小單位
- 日誌檔案中的日誌項
- 一本電影的具體資訊
- 一首歌的詳細資訊
- 文件會被序列化成 JSON 格式,儲存在 Elasticsearch 中
- JSON 物件由欄位組成,
- 每個欄位都有對應的欄位型別(字串/數值/布林/日期/二進位制/範圍型別)
- 每個文件都有一個 Unique ID
- 可以自己指定 ID 或者通過 Elasticsearch 自動生成
案例
{
"songName" : "說好不哭",
"singer" : "周杰倫",
"price" : 3
}
文件的元資料
{
"_index" : "song",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"songName" : "說好不哭",
"singer" : "周杰倫",
"price" : 3
}
}
- 元資料,用於標註文件的相關資訊
- _index :文件所屬的索引名
- _type :文件所屬的型別名
- _id :文件唯一 Id
- _source:文件的原始 JSON 資料
- _all:整合所有欄位內容到該欄位,已被廢除
- _version:文件的版本資訊
- _score:相關性打分
型別(Type)
- 在 7.0 之前,一個 Index 可以設定多個 Types
- 6.0 開始, Type 已經被 Deprecated。7.0 開始一個索引,只能建立一個 Type -"_doc"。
5、RDBMS VS Elasticsearch
下面是 RDBMS 和 Elasticsearch 一個不是很恰當類比,Elasticsearch 叢集可以包含多個索引 Indes(資料庫),每一個索引可以包含一個doc型別 Type(表),每一個型別包含多個文件 Document(記錄),然後每個文件包含多個欄位 Fields(列),DSL 相當於 RDBMS 的 SQL。
RDBMS | Elasticsearch |
---|---|
Schema | Mapping |
Table | Index(Type) |
Column | Filed |
Row | Document |
SQL | DSL |
6、小結
與傳統 SQL 資料庫管理系統(其花費10秒鐘以上的時間來獲取所需的搜尋查詢資料)相比,Elasticsearch 可以在10毫秒內完成此操作。由於 Elasticsearch 具有分散式架構,因此它可以擴充套件到數千個伺服器並容納PB級的資料。我們不必管理分散式設計的複雜性,因為 ES 已經自動完成。我們有多種方法可以為一些文件建立索引或查詢它們,然而在使用 ES 下,我們可以輕鬆實現在海量資料快速檢索全文,得到我們想要的結果