目錄
本文所有命令均在 Kibana 的 dev tools 上進行
1. 基本概念
1.1 Node 與 Cluster
Elastic 本質上是一個分散式資料庫,允許多臺伺服器協同工作,每臺伺服器可以執行多個 Elastic 例項。單個 Elastic 例項稱為一個節點(node)。一組節點構成一個叢集(cluster)。
1.2 Index
Elastic 會索引所有欄位,經過處理後寫入一個反向索引(Inverted Index)。查詢資料的時候,直接查詢該索引。所以,Elastic 資料管理的頂層單位就叫做 Index(索引)。它是單個資料庫的同義詞。每個 Index (即資料庫)的名字必須是小寫。
事實上,我們的資料被儲存在分片(shards)中,索引只是一個把一個或多個分片分組在一起的邏輯空間。然而,這只是一些內部細節——我們的程式完全不用關心分片。對於我們的程式而言,文件儲存在索引(index)中。剩下的細節由Elasticsearch關心既可。
可以使用如下命令,查詢本節點下的所有索引
#查詢所有索引
GET _cat/indices?v
可以得到以下結果
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open idx5 Tzjr1CmGRlCOjZUyQ0QUhA 3 0 2 0 8.5kb 8.5kb
yellow open idx4 z7zw83L9Tjyc1Fx7jb6l0A 1 1 3 1 11.8kb 11.8kb
green open idx2 7SSk77DkTN-VpUuXehgaDQ 3 0 7 2 27.2kb 27.2kb
yellow open idx1 1bqxLckjSk-BZtERVNhPZQ 1 1 0 0 283b 283b
green open idx3 qc32ybYBT869QIPaYmcWGQ 3 0 0 0 849b 849b
你可能還注意到客戶索引標記了黃色執行狀況。黃色表示某些副本尚未分配。 此索引發生這種情況的原因是因為預設情況下Elasticsearch為此索引建立了一個副本。 由於我們目前只有一個節點在執行,因此在另一個節點加入叢集的稍後時間點之前,尚無法分配一個副本(用於高可用性)。 將該副本分配到第二個節點後,此索引的執行狀況將變為綠色。
建立索引(使用預設的設定)
PUT idx1/
建立索引同時指定節點的複製和分片數量
PUT idx2/
{
"settings": {
"index": {
"number_of_shards" : "3",
"number_of_replicas" : "0"
}
}
}
查詢索引的基本資訊
GET idx2/
獲取所有索引的設定
GET _all/_settings
刪除索引
DELETE idx3/
1.3 Document
Index 裡面單條的記錄稱為 Document(文件)。許多條 Document 構成了一個 Index。
Document 使用 JSON 格式表示,下面是一個例子。
{
"_index" : "idx2",
"_type" : "_doc",
"_id" : "1",
"_version" : 5,
"_seq_no" : 5,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "BiologyBook2.0",
"price" : 100.0
}
}
同一個 Index 裡面的 Document,不要求有相同的結構(scheme),但是最好保持相同,這樣有利於提高搜尋效率。但是在 es6.0 後續版本中廢除了 type,推薦所有的 Document 均預設使用 _doc 型別。
1.4 Type(將在ES6.0移除)
Document 可以分組,比如weather
這個 Index 裡面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document。
2. 資料的增刪改查
2.1 新增資料
在 es7.x 之後取消了 type
,均使用_doc
同一文件型別,想必之後版本連_doc
也會被取消。
向指定的 /Index/Type
傳送 PUT 請求,就可以在 Index 裡面新增一條記錄。比如,向/idx1/_doc
傳送請求,就可以新增一條人員記錄。
POST /idx4/_doc/
{
"name" : "anqi1.0",
"age" : 20
}
我們會得到如下 json 結果,其中_id
為該記錄id,如果沒指定的話 es 會幫我生成這種隨機id,result
為我們執行的操作,_index
為所屬索引
{
"_index" : "idx4",
"_type" : "_doc",
"_id" : "0u8pvGsB-aEEelT0MVgW",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
我們也可以指定生成的id,這樣的話得到的_id
就為我們指定的數字1
POST /idx4/_doc/1
{
"name" : "anqi1.0",
"age" : 20
}
我們如果對不存在的文件執行更新操作,則會新增一條資料,
PUT /idx4/_doc/2
{
"age" : 33
}
得到如下結果,當然我們不提倡統一索引下存放結構不一樣的資料。(因為只有一個 age 屬性)
{
"_index" : "idx4",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
2.2 查詢資料
根據id獲取文件
GET /idx5/_doc/1
使用如下命令查詢 idx5 索引下所有資料
GET /idx5/_search
得到如下結果, _source
即為插入的資料
{
"took" : 353,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {"value" : 2,"relation" : "eq"},
"max_score" : 1.0,
"hits" : [
{
"_index" : "idx5",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"city" : "Yuanping",
"email" : "123@qq.com"
}
},
{
"_index" : "idx5",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"city" : "Xinzhou",
"email" : "abc@qq.com"
}
}
]
}
}
上面程式碼中,返回結果的 took
欄位表示該操作的耗時(單位為毫秒),timed_out
欄位表示是否超時,hits
欄位表示命中的記錄,裡面子欄位的含義如下。
total
:返回記錄數,本例是2條。max_score
:最高的匹配程度,本例是1.0
。hits
:返回的記錄組成的陣列。
返回的記錄中,每條記錄都有一個_score
欄位,表示匹配的程式,預設是按照這個欄位降序排列。
2.3 更新資料
更新資料就是傳送 PUT
請求,我們這裡將id
為1的資料中age
屬性更新為 22
PUT /idx4/_doc/1
{
"age" : 22
}
更新後我們得到了以下結果
{
"_index" : "idx4",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}
可以看到,記錄的 Id 沒變,但是版本(version)從1
變成2
,操作型別(result)從created
變成updated
,因為這次不是新建記錄
Elasticsearch是一個分散式系統。當documents被建立、更新或者刪除,其新版本會被複制到叢集的其它節點。Elasticsearch既是非同步的(asynchronous )也是同步的(concurrent),其含義是複製請求都是並行傳送的,但是到達目的地的順序是無序的。Elasticsearch系統需要一種方法使得老版本的文件永遠都無法覆蓋新的版本。
每當文件被改變的時候,文件中的
_version
將會被增加(+1)。Elasticsearch使用_version
確保所有的修改都會按照正確的順序執行。如果文件舊的版本在新的版本之後到達,它會被簡單的忽略。
2.4 刪除資料
刪除資料就是傳送 DELETE
請求
DELETE /idx4/_doc/1