1. 程式人生 > 其它 >穀粒商城學習——P105-109es入門

穀粒商城學習——P105-109es入門

初步檢索

1、_cat

get方式查詢es的一些資訊/_cat/allocation

/_cat/shards
/_cat/shards/{index}
/_cat/master檢視主節點  
/_cat/nodes檢視所有節點
/_cat/tasks
/_cat/indices檢視所有索引
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health檢視健康狀況
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool /_cat/thread_pool/{thread_pools} /_cat/plugins /_cat/fielddata /_cat/fielddata/{fields} /_cat/nodeattrs /_cat/repositories /_cat/snapshots/{repository} /_cat/templates

2,索引一個文件(儲存)

儲存一個數據,儲存在哪個索引的哪個型別下,指定用哪個唯一標識

PUT customer/external/1

{ "name":"John Doe" }

在customer索引下的external型別下儲存1號資料,postman下請求

返回資料如下:帶_的統稱為元資料,反應了一些基本資訊

{
    "_index": "customer",表明該資料在哪個索引(資料庫)下;
    "_type": "external",哪些型別下(表)
    "_id": "1",儲存資料的id是幾
    "_version": 1,儲存資料的版本
    "result": "created",儲存的結果,created為新建,同樣的請求傳送多次,後面的均為更新updated,看下圖
    "_shards": {分片資訊
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    
"_primary_term": 1 }

上面的請求為PUT,儲存新增二合一,必須指定id,這個id下的資料沒有就新增,有就更新

也可以post請求,post具有PUT的功能,put不指定id會儲存,但post可以不指定id,這樣post的資料永遠都是新增(返回它自己生成的id),若指定id則和put功能一樣

3,查詢文件

es的api是restful的,rest api可移步阮一峰RESTful API 設計指南

因此查詢,就是把上面put示例的PUT改為GET即可

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 2,
    "_seq_no": 1,_seq_no和_primary_term樂觀鎖操作相關, 
    "_primary_term": 1,
    "found": true,found為true代表找到了資料
    "_source": {找到的資料的內容
        "name": "John Doe"
    }
}

樂觀鎖示例:

put或post請求後掛參:

if_seq_no=1&if_primary_term=1

執行後,_seq_no變成了4,如果比改變_seq_no再次執行上述請求

則會報錯,提示current document has seqNo [4] and primary term [1],現在seqNo 已經變成4了。這也就控制了一部分併發

 "reason": "[1]: version conflict, required seqNo [1], primary term [1]. current document has seqNo [4] and primary term [1]",

4,更新文件

前面post資料基礎上,加上/_update,同事請求體用{"doc":}包裝起來,同樣可實現更新操作。ps:put不行,405not allowed

加不加_update有什麼區別呢?

加了_update,除了請求體需要用{"doc":}包起來,在更新內容不變的情況下,_version和_seq_no是不變的

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 3,
    "result": "noop",no+operation,資料沒有變化的情況下,執行_update更新時沒有操作的
    "_shards": {
        "total": 0,
        "successful": 0,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 1
}

5,刪除文件&索引

刪除文件

DELETE /customer/external/1

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 4,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 5,
    "_primary_term": 1
}

刪除索引

DELETE customer即可

型別相當於mysql中的表,無法直接刪除

6.bulk批量API

POST customer/external/_bulk

{"index":{"_id":"1"}}//index索引一條資料,id為1
{"name":"Jone Doe"}//index索引資料的內容
{"index":{"_id":"2"}}
{"name":"Jane Doe"}

必須是post,兩行為一個整體,語法格式

{action:{metadata}}\n
{request body  }\n

{action:{metadata}}\n
{request body  }\n

postman不支援換行型別的資料,移步Kibana

#! Deprecation: [types removal] Specifying types in bulk requests is deprecated.
{
  "took" : 112,花費了112毫秒
  "errors" : false,沒有發生任何錯誤
  "items" : [items有兩條資料,每條資料獨立統計它自己的資料,任何一條記錄的失敗,都不會影響任何一條其他資料
    {
      "index" : {儲存的原資訊體
        "_index" : "customer",
        "_type" : "external",
        "_id" : "1",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 0,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "index" : {
        "_index" : "customer",
        "_type" : "external",
        "_id" : "2",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 1,
        "_primary_term" : 1,
        "status" : 201
      }
    }
  ]
}

複雜例項POST /_bulk

POST /_bulk 沒有指定任何索引的任何型別,說明是要對整個es批量操作
{"delete":{"_index":"website","_type":"blog","_id":"123"}}刪除哪個索引哪個型別下id為哪個的資料,刪除沒有請求體,請求資訊都在元資料中  
{"create":{"_index":"website","_type":"blog","_id":"123"}}建立操作
{"title":"My first blog post"}建立操作的內容
{"index":{"_index":"website","_type":"blog"}}儲存記錄
{"title":"my second blog post"}儲存的內容
{"update":{"_index":"website","_type":"blog","_id":"123"}}更新記錄
{"doc":{"title":"My updated blog post"}}更新的內容

執行結果:

{
  "took" : 190,
  "errors" : false,
  "items" : [
    {
      "delete" : {
        "_index" : "website",
        "_type" : "blog",
        "_id" : "123",
        "_version" : 1,
        "result" : "not_found",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 0,
        "_primary_term" : 1,
        "status" : 404說明沒找到這條記錄
      }
    },
    {
      "create" : {
        "_index" : "website",
        "_type" : "blog",
        "_id" : "123",
        "_version" : 2,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 1,
        "_primary_term" : 1,
        "status" : 201建立成功
      }
    },
    {
      "index" : {
        "_index" : "website",
        "_type" : "blog",
        "_id" : "H62vk3oB2xZASEa9yqEY",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 2,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "update" : {
        "_index" : "website",
        "_type" : "blog",
        "_id" : "123",
        "_version" : 3,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 3,
        "_primary_term" : 1,
        "status" : 200
      }
    }
  ]
}

準備了一份顧客銀行賬戶資訊的虛構的JSON文件樣本。每個文件都有下列的schema(模式)。

我用的時候原地址以及404了,感謝評論區給出的地址

https://gitee.com/xlh_blog/common_content/blob/master/es測試資料.json,不太方便複製,也不太方便插入到程式碼,我給大家放到檔案裡了

穀粒商城P109資料.json

匯入測試資料

POST bank/account/_bulk