Elasticsearch的基本操做(三)

添加索引

  • 索引(index)是存儲數據的地方,實際上索引是一個指向一個或者多個分片的"邏輯命名空間"。
  • 一個分片(shard)是一個最小級別的"工做單元",它只是存儲了索引中索引數據的一部分,除此以外一個shard就是一個Lucenes實例。分片在集羣內是很重要的,在集羣擴大或者縮小的時候,Elasticsearch將會自動愛你的節點間遷移分片,以便保持集羣的平衡。
  • 複製分片只是主分片的一個副本,它能夠防止硬件的故障致使的數據丟失,同時能夠提供讀請求,好比搜索或者從別的分片取回文檔。主分片是在索引建立的時候就已經肯定的,複製分片徹底能夠在後期調整。

如今咱們能夠建立一個名爲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

文檔字定義ID和自增id

字定義ID

PUT /{index}/{type}/{id} { "field":"value" ... }spa

自增ID

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"} }
複製代碼
相關文章
相關標籤/搜索