Elasticsearch基礎——概念和基本API操作

Elasticsearch 版本爲 7.1.0 ,本文的講解都是基於該版本
文章中Elasticsearch將使用簡稱ES代替

一、基本概念

文檔——Document

ES是面向文檔的搜索,文檔是ES所有可搜索數據的最小單元。在ES中文檔會被序列化成json格式進行保存,每個文檔都會有一個Unique ID,這個ID可以有用戶在創建文檔的時候指定,在用戶未指定時則由ES自己生成。

在ES中一個文檔所包含的元數據如下:

  • _index:文檔所屬索引名稱

  • _type:文檔所屬類型名

  • _id:文檔唯一ID

  • _version:文檔的版本信息

  • _seq_no:Shard級別嚴格遞增的順序號,保證後寫入文檔的_seq_no大於先寫入文檔的_seq_no

  • _primary_term:主分片發生重分配時遞增1,主要用來恢復數據時處理當多個文檔的_seq_no一樣時的衝突

  • _score:相關性評分,在進行文檔搜索時,根據該結果與搜索關鍵詞的相關性進行評分

  • _source:文檔的原始JSON數據

ES中一個文檔的栗子如下:


{
  "_index" : "user",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 3,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "username" : "dream-hammer",
    "message" : "愛做夢的錘子13",
    "test" : "測試"
  }
}

上面舉栗子的文檔是直接使用文檔id獲取的,所有沒有相關性評分。
從ES 7.0 版本開始一個索引只能設置一個Type,ES官方說明是:最開始設計和使用類型的初衷是在與 Lucene 不兼容的單個索引中提供多租戶,但是在實際使用中,事實證明,使用類型帶來的問題比解決的問題還多,所以從7.0開始棄用了接受類型的 API,引入了新的無類型 API,並移除了對 default 映射的支持,從8.0開始將移除接受類型的 API。具體的說明可以參照官方說明《告別類型。迎接無類型》(點擊打開)

索引——Index

索引這個詞可以有兩個理解名詞和動詞。當作名詞使用時,就是指存在的實體,體現的是一種邏輯空間概念。當動詞使用時通常代表一種動作,也可以理解爲“建立索引”這個動作的簡略說法。

在ES中索引(名詞)是一類文檔的集合,是文檔的容器,通常索引是由兩部分構成:Mapping和Setting。Mapping
定義該索引包含的文檔的數據結構的信息;Setting定義了該索引的數據分佈信息

節點——Node

在ES服務中,一個ES實例,本質上是一個Java進程,每個ES實例可以承擔不同的工作內容,ES的實例我們可以稱之爲節點,當一個節點承擔某項工作內容時,就可以稱這個節點爲xxx節點。ES中一個節點可以承擔多種功能,每個節點都有一個名字和一個UID,節點名稱可以通過配置文件指定,或者在啓動ES實例時使用命令參數的方式:-E node.name='節點名'來指定,節點的UID是保存在實例的data目錄下。

在一個ES的集羣中包含着多個ES的節點,往往每個節點所扮演的角色也不盡相同,ES的節點類型主要包含以下幾類:

  • Master-eligible Node

每個節點啓動後,默認是一個 Master-eligible 節點,Master-eligible的節點可參加選主流程,成爲Master節點,通過配置項 node.master:falase 可以禁用節點的Master-eligible職責,禁止後當前節點就不會參加選主流程

  • Master Node

ES集羣中雖然每個節點都保存了集羣狀態,但是隻有Master節點纔有修改集羣狀態的權限,集羣狀態包括:集羣中節點信息、所有索引和其相關的Mapping和Setting信息、分片的路由信息。在集羣啓動時,第一個啓動的Master-eligible節點會將自己選舉爲主節點。

  • Data Node

保存數據的節點,負責保存分片數據,對數據擴展有重要作用

  • Coordinating Node

負責接受Client請求,將請求分發到合適的節點獲取響應後,將結果最終彙集在一起,每個節點默認都有Coordinating節點的職責

  • Machine Learning Node

負責運行機器學習的Job,用來做異常檢測

  • Ingest Node

數據預處理的節點,支持Pipeline管道設置,可以使用Ingest對數據進行過濾、轉換等操作

每個ES節點可以承擔多個職責,具體配置如下:

  • Master-eligible節點配置:node.master,默認值是true

  • Data節點配置:node.data,默認值是true

  • Ingest節點配置:node.ingest 默認值是true

  • Machine Learning節點配置:node.ml 在enable X-pack的前提下默認是true

  • Coordinating節點配置:無需配置每個節點都是Coordinating節點

分片——Shard

由於單臺機器的存儲能力是有限的,所以爲了解決數據水平擴展問題ES使用了分片的設計。在這個設計中定義了兩種分片類型:主分片(Primary Shard)和副本分片(Replica Shard),主要功能如下

  • 主分片 Primary Shard

主分片用於解決數據水平拓展問題,在ES中可以將一個索引中的數據切分爲多個分片,分佈在多臺服務器上存儲,這樣單個索引數據的拓展就不會受到單機存儲容量的限制。
同時讓搜索和分析等操作分佈到多臺服務器上去執行,吞吐量和性能也得到提升。
每個主分片都是一個lucene實例,是一個最小工作單元,它承載部分數據,具有建立索引和處理請求的能力。主分片數在創建索引的時候就需要指定,後續不可再修改,在ES 7.0版本之前一個索引的默認主分片是5,從ES 7.0 開始索引的默認主分片數量改爲了1

  • 副本分片 Replica Shard

副本分片用於保證數據服務的高可用。一個索引的多個分片分佈在不同的機器上存儲,當一個服務器宕機後,就會造成該索引分片數據丟失,因此ES也設計了分片的副本機制。
一個分片可以創建多個副本,副本分片的數量也可以動態調整,副本分片可以在主分片故障時提供備用服務,保證數據安全,同時設置合理個數的副本分片還可以提升搜索的吞吐量和性能。

  • 分片設定的問題

主分片數設置過小

  • 後續無法通過增加節點實現水平拓展
  • 單個分片數據量太大,數據重分配慢

主分片數設置過大

  • 影響搜索的準確性
  • 單個節點上分片過多,浪費資源和性能

二、文檔基本操作

Create

  • 1.POST {index_name}/_doc {data}

index_name:指定索引名稱
data:要存儲的數據

創建文檔時自動生成文檔id,若指定的索引不存在,則創建索引

示例:


POST user/_doc
{
  "username" : "dream-hammer",
  "message" : "愛做夢的錘子"
}

  • 2.PUT {index_name}/_doc/{id}?op_type=create {data}

index_name:指定索引名稱
id:指定文檔id
data:要存儲的數據

創建新文檔使用指定的文檔id,若id已存在,則報錯,若指定的索引不存在,則創建索引

示例:


PUT user/_doc/1?op_type=create
{
  "username" : "dream-hammer",
  "message" : "愛做夢的錘子"
}

  • 3.PUT {index_name}/_create/{id} {data}

index_name:指定索引名稱
id:指定文檔id
data:要存儲的數據

創建新文檔使用指定的文檔id,若id已存在,則報錯,若指定的索引不存在,則創建索引


PUT user/_create/1
{
  "username" : "dream-hammer",
  "message" : "愛做夢的錘子"
}

Read

  • 1.GET {index_name}/_doc/{id}

index_name:指定索引名稱
id:指定文檔id

獲取指定索引下的指定id的文檔

示例:


GET user/_doc/1

Update

  • 1.PUT {index_name}/_doc/{id} {data}

index_name:指定索引名稱
id:指定文檔id
data:要更新的數據

先刪除指定id的文檔數據,再將當前數據寫入,指定id文檔不存在時,則插入當前數據,與創建文檔的第二種方式對比,當有op_type=create時,就是創建文檔

示例:


PUT user/_create/1
{
  "username-new" : "dream-hammer"
}

  • 2.POST {index_name}/_update/{id} {data}

index_name:指定索引名稱
id:指定文檔id
data:要更新的數據

將更新數據與指定id的文檔原始數據進行合併更新,若指定id文檔不存在,則報錯

示例:


POST user/_update/1
{
  "doc":{
    "message" : "愛做夢的錘子update",
    "test":"測試"
  }
}

Delete

  • 1.DELETE {index_name}/_doc/{id}

index_name:指定索引名稱
id:指定文檔id

刪除指定id的文檔

示例:


DELETE user/_doc/3

批量操作

  • _buik

請求格式如下:


POST _bulk
{operation:{"_index":"{index_name}","_id":"10"}}
{ data}
{operation:{"_index":"{index_name}","_id":"10"}}
{ data}
... ...

operation:操作類型
index_name:指定索引名稱
id:指定文檔id
data:操作數據,當操作沒有不需要數據時,可以不寫

一次請求可以指定多個索引進行多種操作,每個操作都有自己的返回碼,各個操作之間的成功與否不相互影響

示例:


POST _bulk
{ "index" : { "_index" : "user", "_id" : "1" } }
{ "username" : "愛做夢的錘子1" }
{ "delete" : { "_index" : "user", "_id" : "1" } }
{ "create" : { "_index" : "user", "_id" : "2" } }
{ "username" : "愛做夢的錘子2" }
{ "update" : {"_index" : "user""_id" : "1"} }
{ "doc" : {"username" : "愛做夢的錘子update"} }

  • _mget

方式一

請求格式如下:


GET /_mget
{
    "docs" : [
        {
            "_index" : {index_name},
            "_id" : {id}
        },
        {
            "_index" : {index_name},
            "_id" : {id}
        },
        ... ...
    ]
}

index_name:指定索引名稱
id:指定文檔id

一次請求get到指定的多個索引的多個id的文檔


GET _mget
{
  "docs":[
    {
      "_index":"user",
      "_id":"1"
    },
        {
      "_index":"movies",
      "_id":"1163"
    }
  ]
}

方式二

請求格式如下:


GET {index_name}/_mget
{
    "docs" : [
        {
            "_id" : {id}
        },
        {
            "_id" : {id}
        },
        ... ...
    ]
}

index_name:指定索引名稱
id:指定文檔id

一次請求get到一個指定索引下的多個id的文檔

示例:


GET user/_mget
{
  "docs":[
    {
      "_id":"1"
    },
    {
      "_id":"2"
    }
  ]
}

  • _msearch

方式一

請求格式如下:


POST _msearch
{"index":{index_name}}
{搜索表達式}
{"index":{index_name}}
{搜索表達式}
... ...

index_name:指定索引

一次性請求對多個索引進行查詢操作

示例:


POST _msearch
{"index":"user"}
{"query" : {"match_all" : {}},"size":1}
{"index":"movies"}
{"query" : {"match_all" : {}},"size":2}

方式二

請求格式如下:


POST {index_name1}/_msearch
{}
{搜索表達式}
{"index":{index_name2}}
{搜索表達式}
... ...

index_name1:指定的默認索引
index_name2:指定的特定索引

一次性請求對多個索引進行查詢操作,在請求的Url中包含了一個默認索引,在請求體中如果不指定索引名稱,則就使用搜索表達式搜索默認索引

示例:


POST user/_msearch
{}
{"query" : {"match_all" : {}},"size":1}
{"index":"movies"}
{"query" : {"match_all" : {}},"size":2}
{}
{"query" : {"match_all" : {}},"size":1}

**總結:**讀完本文,對ES的基本概念,就會有個基本認識,同時也可以嘗試自己去操作一下ES,掌握ES的基礎API

個人公衆號【愛做夢的錘子】,全網同id,個站 http://te-amo.site,歡迎關注,裏面會分享更多有用知識,還有我的私密照片

覺得不錯就點個贊叭QAQ

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