Getting started 快速開始
Elasticsearch 是一個高度伸縮的開源全文搜尋與分析引擎。它可以使你快速的近乎于準實時的存儲、查詢和分析超大資料集。它通常被用來當做建構複雜查詢特性和需求強大應用的基礎引擎/技術。
Elasticsearch 可以被用在如下幾個場景:
1. 當你營運一個提供客戶檢索商品的線上電子商城的時候,可以使用ES來存儲整個商品目錄和庫存,并且為客戶提供檢索和自動推薦功能。
2. 收集交易資料,存儲并做趨勢、統計、概要或異常分析。這種情況下,可以使用Logstash來收集、聚合和解析資料,并且存儲到 Elasticsearch。一單資料進入 Elasticsearch,你可以檢索,聚合來掌握你感興趣的資訊。
3. 價格預警平台,為價格敏感客戶提供比對其需求(主要是價格方面)的商品。
4. 在報表分析/BI領域,可以使用ES的聚合功能完成針對大資料量的複雜分析。
Basic Concepts 基本概念
如有是Elasticsearch的幾個核心概念。開篇了解這幾個概念對後面的學習過程非常有幫助。
Near Realtime (NRT) 準實時
Elasticsearch 是一個準實時搜尋平台。這句話的意思是,從建立索引到可以被查詢之間的延時很短(正常情況下一秒的延時)。
Cluster 叢集
一個 Elasticsearch 叢集是一到多個ES 節點的集合,儲存了所有資料和提供了跨叢集内所有節點的聯合索引和搜尋能力。一個叢集被命名為唯一的名字(預設為 elasticsearch)。叢集名稱非常重要,因為當一個節點通過叢集的名字加入叢集時,一個節點隻能是一個叢集的一部分。
確定在不同的環境使用不同的叢集名稱,否則會導緻節點添加到錯誤的叢集。比如你可以用logging-dev\logging-state\logging-prod來區分不同環境叢集。
注意,隻有一個節點的叢集是有效且非常好的。此外,您還可以擁有多個獨立的叢集,每個叢集都有自己獨特的叢集名稱。
Node 節點
一個節點是作為叢集一部分的單個伺服器,存儲資料并參與叢集的索引和搜尋。與叢集一樣,節點由一個名稱辨別,預設情況下,該名稱是在啟動時配置設定給節點的随機通用唯一辨別符(UUID)。如果不希望使用預設值,則可以定義所需的任何節點名稱。節點名稱對于管理目的很重要,因為您希望确定網絡中的哪些伺服器對應于 Elasticsearch 叢集中的哪些節點。
一個節點可以被設定添加到指定名稱的叢集。預設情況下,每個節點會被設定加入到名稱為elasticsearch 的叢集,意味着,如果在你的網絡中啟動一些節點(假設這些節點可以發現彼此),他們會自動形成并加入名稱為elasticsearch的叢集。
在一個急群衆,你可以擁有你想要的節點數。此外,如果在你的網絡中沒有任何Elasticsearch 節點,啟動一個node會組成一個名稱為sleasticsearch的單節點叢集。
Index 索引
一個索引是一個擁有一些相似特征的文檔的集合。比如,你可以擁有一個客戶資料的索引,一個商品目錄索引,甚至一個訂單資料索引。一個索引同城被一個名字(所有字母必須小寫)标示并且當針對這個索引的文檔執行索引、搜尋、更新和删除操作的時候這個名字被用來指向索引。
Type 類型
一個type通常是一個索引的一個邏輯分類/分區,允許在 一個索引下存儲不同類型的文檔。比如使用者類型,部落格類型。現在已經不能在一個索引下建立多個類型,并且類型概念已經在後續版本删除。見[詳細](https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html)
Document 文檔
一個文檔是可以被索引的基本資訊單元。比如,你可以為一個客戶建立一個文檔,為一個商品建立一個文檔。文檔可以用json表示。在一個索引李,你可以存儲足夠你想想的文檔數。
Shards & Replicas 分片 & 複本
一個節點可能存儲大量資料導緻突破單個節點的硬體極限。舉個例子,占用1TB磁盤空間的數十億個文檔的單個索引可能不适合單個節點的磁盤,或者單個節點速度太慢,無法滿足搜尋請求。
為了解決這些問題,Elasticsearch 提供了将索引拆分成多個片的稱作分片的能力。當建立一個索引,可以簡單的設定你想要的分騙術。每個分片内部是一個全功能且獨立的“index”可以被存儲在叢集的任何節點。
從兩個方面來說下分片的重要性:
1. 它允許你水準拆分/擴充你的資料集
2. 它允許你跨分片分布式并行操作來提升性能和吞吐。
分片結構如何分布以及檢索請求結果文檔如何聚合由 Elasticsearch 管理,這些對使用者來說是透明的。
在随時可能發生故障的網絡/雲環境中,強烈建議提供故障轉移機制以防分片/節點以某種方式脫機或因任何原因消失。為此,ElasticSearch允許您将索引分片的一個或多個副本複制成所謂的副本分片,簡稱為副本。
從兩個方面說下副本的重要性:
1. 它提供了高可用機制以防分片/節點失敗。明确指出,一個副本不能與要拷貝的原始/主 分片配置設定在同一個節點。
2. 它允許你水準擴容你的查詢資料集/吞吐,因為檢索可以在所有副本并行執行。
簡而言之,每一個索引可以被拆分為多個分片。一個索引頁可以有0或多個副本。索引一單被複制,每一個索引會有主分片和複制分片。
建立索引的時候可以為每個索引指定分片數和複本數。索引建立完成後,還可以動态修改副本數。你可以通過_shrink 和 _split APIs 來改變已經存在索引的分片數。然而,這不是一個簡單的任務,預先計劃正确的分片數是最佳方法。
預設情況下,在 Elasticsearch的每個索引配置設定了一個主分片和一個副本,意味着如果你的雞群裡至少有兩個節點,你的索引會擁有一個主分片和另一個複制分片,每個索引總共兩個分片。
注:每一個 Elasticsearch 分片是一個Lucene索引。每一個 Lucene索引都有文檔存儲上限。 As of LUCENE-5843, the limit is 2,147,483,519 (= Integer.MAX_VALUE - 128) documents。可以通過 _cat/shards API監控分片數。
Installation 安裝
[見](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-install.html)
Exploring Your Cluster 探索叢集
The REST API
現在我們已經啟動并運作起來了節點(和叢集),下一步是了解怎麼與其進行通信。幸運的是,Elasticsearch 提供了非常全面和強大的 REST API,我們可以借助這些API與叢集互動。通過使用API我們可以完成下面這些事情:
1. 檢查叢集、節點和索引的健康、狀态及分析。
2. 管理叢集、節點、索引資料和中繼資料。
3. 執行CRUD操作和依靠索引進行檢索操作。
4. 執行進階檢索操作比如分頁,排序,過濾,腳本,聚合以及其他更多操作。
Cluster Health 叢集健康
執行GET http://localhost:9200,結果日下:
{
"name" : "KmARDca",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "AaFAZp9sTr2Lb7Em5k_fCw",
"version" : {
"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
檢查叢集健康情況,可以使用 _cat API。
GET /_cat/health?v
執行http://localhost:9200/_cat/health?v,結果如下:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1557402508 19:48:28 elasticsearch yellow 1 1 5 5 0 0 5 0 - 50.0%
如上所示:名稱為elasticsearch的叢集目前狀态為yellow。原因是目前隻有一個node,無法配置設定副本空間。
叢集分為三種狀态,分别為:綠,黃和紅。
1. 綠-代表一切正常(叢集可用)
2. 黃-代表所有資料可用,但是一些複本沒有被配置設定(叢集可用)
3. 紅-代表部分資料可用(叢集部分可用)
擷取叢集節點清單:
GET /_cat/nodes?v
執行http://localhost:9200/_cat/nodes?v,結果如下:
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 16 100 6 2.61 mdi * KmARDca
List All Indices 擷取所有索引
GET /_cat/indices?v
執行http://localhost:9200/_cat/indices?v,結果如下:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open kol XFtwMTcfRROJ4q7_4mX7gg 5 1 1 0 4.8kb 4.8kb
Create an Index 建立索引
PUT /customer?pretty
GET /_cat/indices?v
Index and Query a Dcument 索引和查詢一個文檔
PUT /customer/_doc/1?pretty
{
"name" : "John Doe"
}
傳回結果如下:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
注意:Elasticsearch 不需要使用者在建立索引文目前顯示的去建立一個索引,如果索引不存在它可以自動建立。
查詢剛剛索引的文檔:
GET /customer/_doc/1?pretty
傳回結果如下:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 25,
"_primary_term" : 1,
"found" : true,
"_source" : { "name": "John Doe" }
}
Delete an Index 删除索引
DELETE /customer?pretty