ElasticSearch restful實操

引言:

1. RESTful介紹:RESTful 是目前最流行的 API 設計規範,用於 Web 數據接口的設計。RESTful 的核心思想就是,客戶端發出的數據操作指令都是"動詞 + 賓語"的結構。比如,GET /articles這個命令,GET是動詞,/articles是賓語。     參考:阮一峯的網絡日誌:http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

 REST基本操作:

GET :獲取對象的當前狀態          PUT :改變對象的狀態           POST :創建對象              DELETE :刪除對象            HEAD :獲取頭信息 

2. curl命令:簡單的認爲是可以在命令行下訪問url的一個工具。 curl可以利用URL語法在命令行實現常見的 get/post請求。

  Curl的使用
     -X 指定http請求的方法GET POST PUT DELETE

     -d 指定要傳遞的參數

 

3. ES 內置的REST接口

URL

說明

/index/_search

搜索指定索引下的數據

/_aliases

獲取或者操作索引下的別名

/index/

查看指定索引下的詳細信息

/index/type/

創建或者操作類型

/index/mapping

創建或者操作mapping

/index/settings

創建或者操作settings

/index/_open

打開指定索引

/index/_close

關閉指定索引

/index/_refresh

刷新索引(使新增加內容對搜索可見, 不保證數據被寫入磁盤)

/index/_flush

刷新索引(會觸發Lucene提交數據)

 

4. ES vs關係型數據庫

關係型數據 庫

Database

(數據庫)

Table

(表)

Row

(行)

Column

(列)

ElasticSear ch

Index

(索引庫)

Type

(類型)

Document

(文檔)

Field

(字段)

1. CURL命令創建索引庫

控制檯執行命令:

  curl -XPUT 'http://localhost:9200/test01'           (創建了名爲 ‘test01’的索引庫)。

  curl -H "Content-Type: application/json" -XPOST http://localhost:9200/test01/user/1 -d '{"name" : "jack","age" : 28}'      (有ID,自己添加的)

  curl -H "Content-Type: application/json" -XPOST http://localhost:9200/test01/user/ -d '{"name" : "john"}'                          (無id,系統會自動添加id)

命令解釋:-H "Content-Type: application/json" -XPOST 針對es高版本的,老版本可以不用寫。創建時使用 put post 都可以,但二者還是有區別的。

 

PUT和POST的用法區別 :

  PUT是冪等方法,而POST並不是。所以PUT用於更新操作,POST用於新增操作比較合適。

  所謂冪等是指不管進行多少次操作, 其結果都一樣。PUT,DELETE操作是冪等的 ,POST操作不是冪等的,比如常見的POST重複加載問題:當我們 多次發出同樣的POST請求後,其結果是創建出了若干的資源。

  還有一點需要注意的就是,創建操作可以使用POST,也可以使用 PUT,區別在於POST是作用在一個集合資源之上的(/articles), 而PUT操作是作用在一個具體資源之上(/articles/123)

  比如說 很多資源使用數據庫自增主鍵作爲標識信息,而創建的資源的標識 信息到底是什麼只能由服務端提供,這個時候就必須使用POST。 

創建索引庫注意事項 :

    1. 索引庫名稱必須要全部小寫,不能以下劃線開頭,也不能包含逗號 。

    2. 如果沒有明確指定索引數據的ID,那麼es會自動生成一 個隨機的ID,需要使用POST參數。 

 

執行結果:head插件中顯示結果:

 

2. 查詢索引GET  

 在url後面加上一個pretty則會對返回結果進行格式化。

  查詢整個索引庫:curl -XGET 'http://localhost:9200/test/_search?pretty
      查詢某一個type:curl -XGET 'http://localhost:9200/test/user/_search?pretty
      查詢具體的一條記錄:curl -XGET 'http://localhost:9200/test/user/1?pretty'
      查詢一條索引文檔中的具體的字段:curl -XGET 'http://localhost:9200/test/user/1?_source=name&pretty'
            如果要查詢多個字段,使用","進行隔開。eg. 
            curl -XGET 'http://localhost:9200/test/user/1?_source=name,age&pretty'
      獲取source所有數據 
            curl -XGET 'http://localhost:9200/test/user/1?_source&pretty '
      根據條件進行查詢 
            
curl -XGET 'http://localhost:9200/test/user/_search?q=name:john&pretty'

MGET查詢:   mget API獲取多個文檔.

  curl -H "Content-Type: application/json" -XGET http://localhost:9200/test/user/_mget?pretty -d '{"docs":[{"_id":1},{"_id":2}]}'  

   如果所有的文檔擁有相同的_index 以及 _type,直接在請求中添加 ids的數組即可。

  curl -H "Content-Type: application/json" -XGET http://localhost:9200/test/user/_mget?pretty -d '{"ids":["1","2"]}'
 
HEAD的使用: 如果只想檢查一下文檔是否存在,你可以使用HEAD來替代GET方法,這樣就只會返回HTTP頭文件。
  

  curl -i -XHEAD http://localhost:9200/test/user/1

        文檔存在返回結果:HTTP/1.1 200 OK                   文檔不存在返回:  HTTP/1.1 404 Not Found

 

3. ES更新操作

  ES可以使用PUT或者POST對文檔進行更新,如果指定ID的文檔已經存在,則執行更新操作 

 

    注意:執行更新操作的時候,ES首先將舊的文檔標記爲刪除狀態,然後添加新的文檔,舊的文 檔不會立即消失,但是你也無法訪問,ES在你添加更多數據的時候,會在後臺清理已經標記爲刪除狀態的文檔。 

 

   局部更新,可以添加新字段或者更新已有

  字段(必須使用POST)

    curl -H "Content-Type: application/json" -XPOST http://localhost:9200/test/user/1/_update -d '{"doc":{"name":"baby","age":27}}'

    查看已經更新後的數據: curl -XGET http://localhost:9200/test/user/1?pretty

 

4. ES刪除操作

    curl -XDELETE http://master:9200/test/user/1

    curl -XGET http://master:9200/test/user/1

    如果文檔存在,result屬性值爲deleted,_version屬 性的值+1。如果文檔不存在,result屬性值爲not_found,但是_version屬性的值依然會+1。

  這個就是內部管理的一部分,它保證了我們在多個節 點間的不同操作的順序都被正確標記了

    注意:刪除一個文檔也不會立即生效,它只是被標記成已刪除。Elasticsearch將會在你之後添加 更多索引的時候纔會在後臺進行刪除內容的清理。

 

5. ES批量操作-bulk 

  bulk API可以幫助我們同時執行多個請求

  格式: action:index/create/update/delete

      metadata:_index,_type,_id

      request body:_source(刪除操作不需要)

      { action: { metadata }} { request body } { action: { metadata }} { request body }

    create 和index的區別 如果數據存在,使用create操作失敗,會提示文檔已經存在,使用index則可以 成功執行。

使用文件的方式
新建一個requests文件
vi requests
{"index":{"_index":"test","_type":"user","_id":"6"}}
{"name":"mayun","age":51}

{"update":{"_index":"test","_type":"user","_id":"6"}}
{"doc":{"age":52}}

從上面可以看出,先使用index創建一條索引,然後更新這條索引,操作 了兩次,version版本號變成了2.
執行批量操作
curl -H "Content-Type: application/json" -XPOST http://localhost:9200/_bulk -- data-binary @requests;

 

6.ES版本控制

   普通關係型數據庫使用的是(悲觀併發控制(PCC)) 。當我們在修改一個數據前先鎖定這一行,然後確保只有讀取到數據的這個線程可以修改這一行數據.
   ES使用的是(樂觀併發控制(OCC)) 。ES不會阻止某一數據的訪問,然而,如果基礎數據在我們讀取和寫入的間隔中發生了變化,更新就會失敗,這時候就由程序來決定如何處理這個衝突。它可以重新讀取新數據來進行更新,又或者將這一情況直接反饋給用戶。

   ES如何實現版本控制(使用es內部版本號)
   首先得到需要修改的文檔,獲取版本(_version)號

    curl -XGET http://localhost:9200/test/user/2

   在執行更新操作的時候把版本號傳過去
    curl -H "Content-Type: application/json" -XPUT

    http://localhost:9200/test/user/2?version=1 -d '{"name":"john","age":29}' curl -H "Content-Type: application/json" -XPOST

    http://localhost:9200/test/user/2/_update?version=2 -d '{"doc":{"age":30}}'
   如果傳遞的版本號和待更新的文檔的版本號不一致,則會更新失敗

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章