目錄node
本文全部命令均在 Kibana 的 dev tools 上進行es6
Elastic 本質上是一個分佈式數據庫,容許多臺服務器協同工做,每臺服務器能夠運行多個 Elastic 實例。單個 Elastic 實例稱爲一個節點(node)。一組節點構成一個集羣(cluster)。數據庫
Elastic 會索引全部字段,通過處理後寫入一個反向索引(Inverted Index)。查找數據的時候,直接查找該索引。因此,Elastic 數據管理的頂層單位就叫作 Index(索引)。它是單個數據庫的同義詞。每一個 Index (即數據庫)的名字必須是小寫。json
事實上,咱們的數據被存儲在分片(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爲此索引建立了一個副本。 因爲咱們目前只有一個節點在運行,所以在另外一個節點加入集羣的稍後時間點以前,尚沒法分配一個副本(用於高可用性)。 將該副本分配到第二個節點後,此索引的運行情況將變爲綠色。async
建立索引(使用默認的設置)分佈式
PUT idx1/
建立索引同時指定節點的複製和分片數量ui
PUT idx2/ { "settings": { "index": { "number_of_shards" : "3", "number_of_replicas" : "0" } } }
查詢索引的基本信息
GET idx2/
獲取全部索引的設置
GET _all/_settings
刪除索引
DELETE idx3/
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 類型。
Document 能夠分組,好比weather
這個 Index 裏面,能夠按城市分組(北京和上海),也能夠按氣候分組(晴天和雨天)。這種分組就叫作 Type,它是虛擬的邏輯分組,用來過濾 Document。
在 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 }
根據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
字段,表示匹配的程序,默認是按照這個字段降序排列。
更新數據就是發送 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
確保全部的修改都會按照正確的順序執行。若是文檔舊的版本在新的版本以後到達,它會被簡單的忽略。
刪除數據就是發送 DELETE
請求
DELETE /idx4/_doc/1