1. 程式人生 > >bulk批量增刪改

bulk批量增刪改

1.bulk語法格式:
 注意: bulk api對json的語法,有嚴格的要求,每個json串不能換行,只能放在一行,多個型別的json串之間,必須換行

POST /_bulk   
{"delete":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}}
{"create":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}}
{實際資料存放的地方}
{"index":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}}
{實際資料存放的地方}
{"update":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}}
{"doc":{實際資料存放的地方}}

2.可操作的型別:
  2.1:delete:刪除一個文件,只要一個json串就行了
  2.2:create: PUT/index/type/id,強制建立一個文件
  2.3:index:普通的PUT操作,可以是新建文件,也可以是全量替換文件
  2.4:update:執行partial update操作
3.程式碼:

POST /_bulk
{"delete":{"_index":"test_index","_type":"test_type","_id":3}}     刪除id為3的資料
{"create":{"_index":"test_index","_type":"test_type","_id":20}}  建立一個id為20的文件
{"test_field":"test20"}   往文件裡面加入資料(test20)
{"index":{"_index":"test_index","_type":"test_type","_id":10}}  全量替換 id為10的文件
{"test_field":"test10"}    替換文件內的全部資料
{"update":{"_index":"test_index","_type":"test_type","_id":1}}  修改id為1的文件
{"doc":{"test_field2":"partial update test1"}}   更新資料

注意:bulk操作中,任意一個操作失敗,是不會影響其他的操作的,但是在返回結果裡,會有一個異常日誌

4.執行結果

{
  "took" : 333,
  "errors" : false,
  "items" : [
    {
      "delete" : {             刪除
        "_index" : "test_index",     索引
        "_type" : "test_type",     型別
        "_id" : "3",          id
        "_version" : 4,         版本
        "result" : "deleted",     刪除結果 
        "_shards" : {
          "total" : 2,
          "successful" : 1,	    刪除成功
          "failed" : 0
        },
        "_seq_no" : 8,
        "_primary_term" : 3,
        "status" : 200
      }
    },
    {
      "create" : {      建立
        "_index" : "test_index", 索引
        "_type" : "test_type",  型別
        "_id" : "20",      id
        "_version" : 1,     版本
        "result" : "created",  建立結果
        "_shards" : {
          "total" : 2,
          "successful" : 1,   建立成功
          "failed" : 0
        },
        "_seq_no" : 7,
        "_primary_term" : 3,
        "status" : 201
      }
    },
    {
      "index" : {
        "_index" : "test_index",
        "_type" : "test_type",
        "_id" : "10",
        "_version" : 6,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 14,
        "_primary_term" : 3,
        "status" : 200
      }
    },
    {
      "update" : {
        "_index" : "test_index",
        "_type" : "test_type",
        "_id" : "1",
        "_version" : 3,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 5,
        "_primary_term" : 3,
        "status" : 200
      }
    }
  ]
}

圖解:
在這裡插入圖片描述
驗證:(這裡使用批量查詢驗證)
 程式碼:

GET /test_index/test_type/_mget
{
  "ids":[3,20,10,1]
}
驗證結果
{
  "docs" : [
    {
      "_index" : "test_index",
      "_type" : "test_type",
      "_id" : "3",
      "found" : false   已刪除,顯示false 表示不存在
    },
    {
      "_index" : "test_index",
      "_type" : "test_type",
      "_id" : "20",
      "_version" : 1,
      "found" : true,  建立成功
      "_source" : {
        "test_field" : "test20"   資料
      }
    },
    {
      "_index" : "test_index",
      "_type" : "test_type",
      "_id" : "10",
      "_version" : 6,    首先看版本號,已經不一樣了,表示全量覆蓋了
      "found" : true,    
      "_source" : {
        "test_field" : "test10"  資料已經改變了
      }
    },
    {
      "_index" : "test_index",
      "_type" : "test_type",
      "_id" : "1",
      "_version" : 3,
      "found" : true,
      "_source" : {
        "test_field1" : "test field1",
        "test_field2" : "partial update test1"       更新的資料
      }
    }
  ]
}

圖解:
在這裡插入圖片描述
如果操作的是同一index和同一索引裡面的資料

格式:
POST/index/type/_bulk
{"delete":{"id名稱":id值}}
{"create":{"id名稱":id值}}
{實際資料存放的地方}
{"index":{"id名稱":id值}}
{實際資料存放的地方}
{"update":{"id名稱":id值}}
{"doc":{實際資料存放的地方}} 

程式碼:
POST /test_index/test_type/_bulk
{"delete":{""_id":3}}
{"create":{"_id":20}}
{"test_field":"test20"}
{"index":{"_id":10}}
{"test_field":"test10"}
{"update":{"_id":1}}
{"doc":{"test_field2":"partial update test1"}}    也可以這樣寫

bulk size最佳的大小:
  bulk request會載入到記憶體裡,如果太大的話,效能反而會下降,因此需要反覆嘗試一個最佳的bulk seize。
一般從10005000條資料開始,嘗試逐條增加,大小最好在515MB之間