引言:
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 指定要傳遞的參數
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獲取多個文檔.
如果所有的文檔擁有相同的_index 以及 _type,直接在請求中添加 ids的數組即可。
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}}'
如果傳遞的版本號和待更新的文檔的版本號不一致,則會更新失敗