如今咱們能夠建立一個名爲blog的索引,給該索引分配3個主分片和一個副分片(每一個主分片一個副分片)web
PUT /blog
{
"settings":{
"number_of_shards": 3,
"number_of_replicas": 1
}
}
複製代碼
此時咱們在調用 GET /_cluster/health 能夠獲得以下的結果數據庫
根據結果能夠得知集羣的狀態是yellow,就是主分片都是可使用的,可是副分片不均可以使用。unassigned_shards的結果是5,表示有5個分片是沒有被分配的,由於這些副分片沒有被分配,就是沒法使用備份主分片的數據,若是出現節點的故障就沒法實現故障轉移,因此這個集羣的狀態是yellow的。數組
在單一節點上運行會存在單點故障,爲了防止單點故障咱們須要作的就是啓動更多的節點,若是咱們在集羣裏面拓展了節點,那麼從節點就會分配在其餘節點上。併發
這個集羣最大能夠拓展到六個節點。less
程序中大多數的實體或對象可以被序列化爲包含鍵值對的JSON對象,鍵是自帶你或者屬性的名字,值能夠是字符出阿伯,數字,不二類型,另一個對象,值數組或者其餘特殊類型。實際上,咱們能夠認爲對象(object)和文檔(document)是等價的。可是它們之間是有差異:對象是一個JSON結構體----相似與哈希,hashmao,字典或者關聯數組,對象中能夠包含其餘對象。在ES中,翁當這個是有特殊含義的,它只要表明了頂層結構或者根對象(root object)序列化成的JSON數據(以惟一ID表示並存儲Elasticsearch中)this
PUT /{index}/{type}/{id} { "field":"value" ... }spa
POST /{index}/{type} { "field":"value" ... }線程
##索引文檔日誌
GET /website/blog/123/_source
複製代碼
返回結果:code
{
"title" : "My first blog entry",
"text" : "Just trying this out...",
"date" : "2014/01/01"
}
複製代碼
DELETE /website/blog/125
複製代碼
返回結果:
{
"_index" : "website",
"_type" : "blog",
"_id" : "125",
"_version" : 2,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 11,
"_primary_term" : 1
}
複製代碼
在上面的結果能夠返現_version增長了1,這個是ES內部記錄的一部分,確保多節點間不一樣操做能夠有正確的順序。
爲了處理併發出現的衝突問題可使用一下兩種方式
1.悲觀併發控制 這個方式在關係型數據庫中內普遍的使用,這種方式假設衝突會發生,爲了解決衝突,就在讀一行數據前鎖定這行,而後確保值枷鎖的那個線程能夠修改這行數據
2.樂觀併發控制
被Elasticsearch使用,這種方式假設衝突不發生,不須要區塊訪問,若是在讀寫過程發生變化,更新操做就會失敗,此時咱們能夠在程序中決定在失敗後如何解決衝突,實際上咱們能夠嘗試更新,刷新數據或者直接反饋給用戶.
文檔是不可變的,它們是不能夠被更改的,只能被替換。update API必須遵循相同的規則。表面上看來,咱們彷佛是局部更新了文檔的某個地方,內部倒是檢索-修改-重建索引的流程,這樣減小了其餘進程可能致使衝突的修改。
POST /website/blog/124/_update
{
"doc":{
"title":"this is test demo"
}
}
複製代碼
在更新的時候可能有其餘人在索引和修改,致使衝突,可是出現衝突沒關係,咱們須要作的就是在出現衝突的時候重試,這樣咱們就能夠結局衝突帶來的問題。
POST /website/blog/124/_update?retry_on_conflict=2
{
#這裏使用的是腳本修改
"script":{
"lang":"painless",
"inline":"ctx._source.title=params.title",
"params":{
"title":"Stander title"
}
}
}
複製代碼
在更新文檔的時候,咱們若是更新了一個不存在的文檔,那麼咱們就會更新失敗,可是咱們能夠作到若是沒有就插入一條記錄,有就更新,以下面的例子
POST /website/blog/1/_update
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 1
}
}
複製代碼
GET /website/blog/_mget
{
"docs":[
{"_id":"1"},
{"_id":"123"}
]
}
複製代碼
返回結果
{
"docs" : [
{
"_index" : "website",
"_type" : "blog",
"_id" : "1",
"_version" : 2,
"_seq_no" : 19,
"_primary_term" : 1,
"found" : true,
"_source" : {
"views" : 2
}
},
{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 3,
"_seq_no" : 6,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "My first blog entry",
"text" : "I am starting to get the hang of this....",
"date" : "2019/07/31"
}
}
]
}
複製代碼
bulk API容許咱們使用單一請求來實現多個文檔的create,index,update或者delete.這個對索引列斯日誌活動這樣的數據六很是因爲,他能夠成敗上千的數據做爲一個批次按順序進行索引。
bulk請求體以下,它有一點不一樣尋常:
{action:{metadata}}\n
{request body}\n
{action:{metadata}}\n
{request body}\n
...
複製代碼
1.這種格式就是使用換行符"\n"將JSON串鏈接起來,能夠說"\n"是做爲每一行的的分離標識
2.每一行不能包含換行符,他們會干擾分析
action有一下幾種:
行爲 | 解釋 |
---|---|
create | 當文檔不存在時建立 |
index | 建立新文檔或者替換已有文檔 |
update | 局部更新文檔 |
delete | 刪除一個文檔 |
例子:
#批量更新
POST /_bulk
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
複製代碼