學習Elasticsearch必需瞭解的十個概念

學習Elasticsearch必需瞭解的十個概念

與學習其他數據庫或語言一樣,學習Elasticsearch首先需要掌握基本概念,理解這些基本概念會讓你的學習曲線少些波折。雖然這些概念特別適用於Elasticsearch,但是在應用整個ELK Stack(Elasticsearch、Logstash 和 Kibana)時理解它們也很重要。爲了更容易理解,我會把一些概念與關係數據庫術語進行比較。

1. 字段

  • 字段
    字段是Elasticsearch數據的最小單元,用來描述文檔。如:標題、作者、日期、摘要等。每個字段有對應數據類型和數據。
    數據類型包括核心數據類型(strings, numbers, dates, booleans),複雜數據類型(object, nested),geo數據類型(get_point, geo_shape)以及特定數據類型(IP,Completion,Alias等)。字段類型不同管理機制也有差異,字段也是Elasticsearch mapping的重要組成部分。

  • 多字段(Multi-fields)
    通常對同一字段針對不同搜索目的使用多種索引方法。如字符串類型字段可以同時映射爲textkeyword類型,前者可以全文索引,後者可進行排序或聚集。當然也可以對同一字段使用不同分析器,如標準分析器,英文分析器或中文分析器。

  • 元字段(Meta-fields)
    每個文檔都包括一些元字段,如_index,_type,_id等。這些元字段可以在創建映射類型時進行自定義。

2. 文檔

文檔是存儲在Elasticsearch中的Json對象,可理解爲基本存儲單元。與關係型數據相比,文檔可看作表中行或記錄。舉例,電子商務的應用中每個產品是一個文檔,或每個訂單是一個文檔。存儲在特定索引中的文檔沒有限制。

文檔中的數據有字段組成,每個字段包括鍵和值。鍵即字段的名稱,值可以不同數據類型對應的內容項,如string, number, boolean , object, array等。文檔也包括保留的元字段:

  • _index – 當前文檔對應索引
  • _type – 當前文檔對應類型(_doc)
  • _id – 當前文檔的唯一標識

文檔示例:

{
   "_id": 3,
   “_type”: [“your index type”],
   “_index”: [“your index name”],
   "_source":{
        "age": 28,
        "name": ["daniel”],
        "year":1989,
    }
}

3. 映射

說到映射需要注意的是,Elasticsearch7.0之後,type已經被棄用。映射類似於關係型數據庫中表的結構(原來的類型相當於表,索引相當於數據庫),在映射中定義文檔字段及其類型,數據類型決定了字段在Elasticsearch中被如何分詞、索引或存儲。舉例:

PUT /example
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "gender": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

4. 映射類型

前面已經提過,映射類型是7.0之前的產物,之後已不再使用。但有必要了解,爲了向後兼容,一些場景中使用_doc作爲默認值。現在可以定義任意字段(keyword)對文檔進行分類,確實也沒有使用映射類型的必要。

5. 索引

索引,Elasticsearch中最大數據單元,可以類比爲關係型數據庫中的數據庫單元。還是前面的示例,索引中可以包含所有產品數據和客戶相關數據。當然也可以在Elasticsearch中定義多個索引,索引使用小寫名稱定義,通過索引可以對文檔執行操作,如搜索、刪除等。

6. 分片

簡言之,分片是Elasticsearch的基本構建塊,底層是單個Lucene索引,多個分片支撐系統可擴展性。索引大小是造成Elasticsearch崩潰的常見原因,由於每個索引可存儲文檔數量沒有限制,所以索引佔用的磁盤空間可能會超過主機限制;一旦接近極限,索引就會開始失敗。

解決該問題的一種方法是將索引水平分割爲稱爲多個塊,並允許跨節點進行分佈式分隔以提高性能。創建索引時,可以定義多少分片。每個分片是單獨的Lucene索引,可以在集羣中任何主機上,示例代碼:

PUT /example
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }, 
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "gender": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

7. 複製

複製就如其名稱所暗示的,是Elasticsearch的容錯機制,即索引分片的拷貝。這是有用的備份方式,以備不時之需。同時副本還能提供讀請求,因此增加副本還可以提高搜索性能。

爲了確保高可用性,副本不放在與原始分片(也稱爲主分片)相同的節點上。舉例,Shard1可能與Shard2副本在節點A上,而節點B主機上有Shard2和Shard1的副本。真實場景可能會有更多的分片。

與分片定義一樣,在創建索引時可以指定每個分片的副本數量。但與分片的差別是,副本數量在索引創建之後還可以改變。因此每個分片可以有多個副本,但需要在分片數量上有適當的權衡。過多的片會導致更多開銷和資源消耗,也會影響性能和速度。

8. 分析器

分析器是在索引過程中使用,將短語或表達式分詞、解析成一系列關鍵詞。分析器在索引中定義,包括單個分詞器和多個過濾器。例如,分詞器遇到特定表達式時將字符串分割成特定術語。常見的分析器包括Standard Analyzer 和 Simple Analyzer,以及與特定語言相關的分析器。

缺省情況下Elasticsearch使用Standard Analyzer,其包含基於語法的分詞器,刪除通用詞並增加額外的過濾器。Elasticsearch包括一系列內置分詞器,也支持自定義分詞器。

過濾器用於過濾或修改一些語義詞。如ASCII folding filter會將諸如ê, é, è等字符轉換爲e。

PUT /example
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "analysis": {
      "analyzer": {
        "hanlp_analyzer": {
          "tokenizer": "nc_hanlp"
        }
      },
      "tokenizer": {
        "nc_hanlp": {
          "type": "hanlp",
          "enable_stop_dictionary": true
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "hanlp_analyzer"
      },
      "gender": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

9. 實例與節點

ELK的核心是Elasticsearch實例,其關鍵任務是存儲和索引數據。集羣中不同節點類型負責不同職責:

  • Master nodes — 負責集羣管理配置相關動作,如增加或刪除節點
  • Data nodes — 存儲數據並執行數據相關操作,如搜索和聚集
  • Ingestion nodes — 用於索引前的預處理文檔
  • Machine Learning nodes (有許可) – 這些節點在Elastic許可下可用,支持機器學習任務。

默認情況下,每個節點被自動分配便於管理的唯一標識符(或名稱),所有節點都可以是主節點、數據節點或機器學習節點。當集羣變大時,建議使用單一類型來區分每個節點。
缺省單個節點將形成名爲“elasticsearch”單節點集羣,但也可使用其他集羣名稱將其配置爲現有集羣的節點。當然這些節點需要能夠相互識別才能連接。
在開發或測試環境中可以在單臺服務器上設置多個節點。但在生產環境中,由於Elasticsearch節點消耗資源數量較多,建議在單個服務器上運行一個Elasticsearch實例。

10. 集羣

Elasticsearch集羣有多個節點組成。和節點一樣,集羣帶有節點加入唯一標識。默認爲“elasticsearch”,當然名稱可以修改。請確保在不同環境中不要對集羣使用相同名稱,否則可能節點加入錯誤集羣。

集羣中的主節點負責管理配置工作,如增加或刪除節點。該節點有集羣自動選擇,也可以修改。可以在集羣中任何節點上執行查詢,包括“主”節點。但節點也將查詢轉發給包含被查詢數據的節點。
有許多有用的集羣API,能查詢集羣狀態。舉例,Cluster Health API 狀態報告“綠色”(所有分片都已分配),“黃色”(主分片被分配,但副本分片沒有完全分配),“紅色”(分片沒有被分配)。

GET /_cluster/health
{
  "cluster_name" : "newcloud",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 20,
  "active_shards" : 40,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

11. 總結

意思簡要列舉並解釋了學習ELK時需掌握的主要概念。當然還有其他一些組件和術語也很重要,讀者可以查閱官方文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章