天天看點

Elasticsearch 指南 [7.0] - 快速開始Getting started 快速開始

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           

繼續閱讀