REST 簡介-定義
REST (REpresentation State Transfer)描述了一個架構樣式的網絡系統,比如 web 應用程序。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規范的主要編寫者之一。REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。
Web 應用程序最重要的 REST 原則是,客戶端和服務器之間的交互在請求之間是無狀態的。從客戶端到服務器的每個請求都必須包含理解請求所必需的信息。如果服務器在請求之間的任何時間點重啟,客戶端不會得到通知。此外,無狀態請求可以由任何可用服務器回答,這十分適合雲計算之類的環境。客戶端可以緩存數據以改進性能。
在服務器端,應用程序狀態和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程序對象、數據庫記錄、算法等等。每個資源都使用 URI (Universal Resource Identifier) 得到一個惟一的地址。所有資源都共享統一的界面,以便在客戶端和服務器之間傳輸狀態。使用的是標准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。
REST 簡介-資源
REST 簡介-基本操作
1)GET 獲取對象的當前狀態
2)PUT 改變對象的狀態
3)POST 創建對象
4)DELETE 刪除對象
5)HEAD 獲取頭信息
REST 簡介-資源
ES 內置的REST接口
ElasticSearch-CURL命令
簡單認為是可以在命令行下訪問url的一個工具
curl是利用URL語法在命令行方式下工作的開源文件傳輸工具,使用curl可以簡單實現常見的get/post請求。
Curl的使用
1)-X 指定http請求的方法GET POST PUT DELETE
2)-d 指定要傳遞的參數
ElasticSearch-CURL命令-建立索引庫
curl -XPUT 'http://master:9200/djt/' PUT/POST都可以
示例:
[hadoop@masternode elasticsearch-2.4.0]$ curl -XPOST http://masternode:9200/zimo/user/1 -d '{"name" : "john", "age" : "28"}'
{"_index":"zimo","_type":"user","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}
輸入網址:http://192.168.86.135:9200/_plugin/head/ 可以看到我們創建的zimo庫成功了。
接下來再看一下創建的數據:
如圖所示,數據也成功創建了。
ElasticSearch-CURL命令-PUT與POST對比
1)PUT是冪等方法,而POST並不是。所以PUT用於更新操作、POST用於新增操作比較合適。
2)PUT,DELETE操作是冪等的。所謂冪等是指不管進行多少次操作,結果都一樣。比如我用PUT修改一篇文章,然后在做同樣的操作,每次操作后的結果並沒有不同,DELETE也是一樣。
3)POST操作不是冪等的,比如常見的POST重復加載問題:當我們多次發出同樣的POST請求后,其結果是創建出了若干的資源。
4)還有一點需要注意的就是,創建操作可以使用POST,也可以使用PUT,區別在於POST是作用在一個集合資源之上的(/articles),而PUT操作是作用在一個具體資源之上的(/articles/123),比如說很多資源使用數據庫自增主鍵作為標識信息,而創建的資源的標識信息到底是什么只能由服務端提供,這個時候就必須使用POST。
ElasticSearch-CURL命令-創建索引注意事項
1)索引庫名稱必須要全部小寫,不能以下划線開頭,也不能包含逗號
2)如果沒有明確指定索引數據的ID,那么es會自動生成一個隨機的ID,需要使用POST參數
curl -XPOST http://master:9200/zimo/user/ -d '{"name" : "john"}'
創建全新內容的兩種方式:
1)使用自增ID(post)
2)在url后面添加參數(get)
[hadoop@masternode elasticsearch-2.4.0]$ curl -XPUT http://masternode:9200/zimo/user/2?op_type=create -d '{"name" : "john", "age" : 28}' {"_index":"zimo","_type":"user","_id":"2","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true} [hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/1 或者 {"_index":"zimo","_type":"user","_id":"1","_version":4,"found":true,"_source":{"name" : "john", "age" : 28}}
ElasticSearch-CURL命令-查詢索引GET
1.根據員工id查詢
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/1 {"_index":"zimo","_type":"user","_id":"1","_version":4,"found":true,"_source":{"name" : "john", "age" : 28}}
在任意的查詢字符串中添加pretty參數,es可以得到易於識別的json結果。
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/1?pretty { "_index" : "zimo", "_type" : "user", "_id" : "1", "_version" : 4, "found" : true, "_source" : { "name" : "john", "age" : 28 } }
2.檢索文檔中的一部分,如果只需要顯示指定字段
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET 'http://masternode:9200/zimo/user/1?_source=name&pretty' { "_index" : "zimo", "_type" : "user", "_id" : "1", "_version" : 4, "found" : true, "_source" : { "name" : "john" } }
3.查詢指定索引庫指定類型所有數據
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/_search {"took":17,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":3,"max_score":1.0,"hits":[{"_index":"zimo","_type":"user","_id":"AWVlstKrgUMcKLYQxfRR","_score":1.0,"_source":{"name" : "john"}},{"_index":"zimo","_type":"user","_id":"2","_score":1.0,"_source":{"name" : "john", "age" : 28}},{"_index":"zimo","_type":"user","_id":"1","_score":1.0,"_source":{"name" : "john", "age" : 28}}]}}
4.根據條件進行查詢
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/_search?q=age:28 {"took":36,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max_score":0.30685282,"hits":[{"_index":"zimo","_type":"user","_id":"2","_score":0.30685282,"_source":{"name" : "john", "age" : 28}},{"_index":"zimo","_type":"user","_id":"1","_score":0.30685282,"_source":{"name" : "john", "age" : 28}}]}}
ElasticSearch-CURL命令-DSL查詢
Domain Specific Language領域特定語言
新添加一個文檔
[hadoop@masternode elasticsearch-2.4.0]$ curl -XPUT http://masternode:9200/zimo/user/3/_create -d '{"name" : "lily", "age" : 18}' {"_index":"zimo","_type":"user","_id":"3","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/_search -d '{"query":{"match":{"name":"lily"}}}' (查詢) {"took":31,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.30685282,"hits":[{"_index":"zimo","_type":"user","_id":"3","_score":0.30685282,"_source":{"name" : "lily", "age" : 18}}]}}
ElasticSearch-CURL命令-MGET查詢
1.使用mget API獲取多個文檔
先新建一個庫
[hadoop@masternode elasticsearch-2.4.0]$ curl -XPUT 'http://masternode:9200/zimo2' {"acknowledged":true}
[hadoop@masternode elasticsearch-2.4.0]$ curl -XPOST http://masternode:9200/zimo2/user/1 -d '{"name" : "lucy", "age" : 20}' {"_index":"zimo2","_type":"user","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/_mget?pretty -d '{"docs":[{"_index":"zimo","_type":"user","_id":2,"_source":"name"},{"_index":"zimo2","_type":"user","_id":1}]}' { "docs" : [ { "_index" : "zimo", "_type" : "user", "_id" : "2", "_version" : 1, "found" : true, "_source" : { "name" : "john" } }, { "_index" : "zimo2", "_type" : "user", "_id" : "1", "_version" : 1, "found" : true, "_source" : { "name" : "lucy", "age" : 20 }
2.如果需要的文檔在同一個_index或者同一個_type中,你就可以在URL中指定一個默認的/_index或者/_index/_type
[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/_mget?pretty -d '{"docs":[{"_id":1},{"_id":2}]}' { "docs" : [ { "_index" : "zimo", "_type" : "user", "_id" : "1", "_version" : 4, "found" : true, "_source" : { "name" : "john", "age" : 28 } }, { "_index" : "zimo", "_type" : "user", "_id" : "2", "_version" : 1, "found" : true, "_source" : { "name" : "john", "age" : 28 } } ] }
3.如果所有的文檔擁有相同的_index 以及 _type,直接在請求中添加ids的數組即可。
curl -XGET http://masternode:9200/zimo/user/_mget?pretty -d '{"ids":["1","2"]}'
結果同上。
ElasticSearch-CURL命令-HEAD使用
如果只想檢查一下文檔是否存在,你可以使用HEAD來代替GET方法,這樣只會返回HTTP頭部文件。
[hadoop@masternode elasticsearch-2.4.0]$ curl -i -XHEAD http://masternode:9200/zimo/user/1 HTTP/1.1 200 OK Content-Type: text/plain; charset=UTF-8 Content-Length: 0
ElasticSearch-CURL命令-更新
ES可以使用PUT或者POST對文檔進行更新(全部更新),如果指定ID的文檔已經存在,則執行更新操作。執行更新操作的時候要注意以下細節:
1)ES首先將就得文檔標記為刪除狀態
2)然后添加新的文檔
3)就得文檔不會立即消失,但是你也無法訪問
4)ES會在你繼續添加更多數據的時候再后台清理已經標記問刪除狀態的文檔、
局部更新:可以添加新字段或者更新已有字段(必須使用POST)
[hadoop@masternode elasticsearch-2.4.0]$ curl -XPOST http://masternode:9200/zimo/user/1/_update -d '{"doc":{"name":"john","age":30}}' {"_index":"zimo","_type":"user","_id":"1","_version":5,"_shards":{"total":2,"successful":2,"failed":0}}
ElasticSearch-CURL命令-刪除
[hadoop@masternode elasticsearch-2.4.0]$ curl -XDELETE http://masternode:9200/zimo/user/1 {"found":true,"_index":"zimo","_type":"user","_id":"1","_version":6,"_shards":{"total":2,"successful":2,"failed":0}}
如果文檔存在,found屬性值為true,_version屬性值+1;
如果文檔不存在,found屬性值為false,但是_version屬性值依然+1,這個就是內部管理的一部分,它保證了我們在多個節點間的不同操作的順序都被 正確標記了;
注意:刪除一個文檔也不會立即生效,它只是被標記我已刪除,ElasticSearch將會在你之后添加更多所以的時候才會在后頭進行刪除內容的清理。
ElasticSearch-CURL命令-bulk批量操作
bulk API可以幫助我們同時執行多個請求。
格式:
action: index/create/update/delete metadata:_index/_type/_id request body:_source(刪除操作不需要) (action:{metadata}) {request body } (action:{metadata}) {request body }
create和ndex的區別:如果數據存在,使用create操作失敗會提示文檔已經存在,使用index則可以成功執行。
//新建一個requests文件
[hadoop@masternode elasticsearch-2.4.0]$ vi requests {"index":{"_index":"zimo","_type":"user","_id":"6"}} {"name":"mayun","age":51} {"update":{"_index":"zimo","_type":"user","_id":"6"}} {"doc":{"age":52}} [hadoop@masternode elasticsearch-2.4.0]$ ls bin config lib LICENSE.txt modules NOTICE.txt plugins README.textile requests //執行批量操作 [hadoop@masternode elasticsearch-2.4.0]$ curl -XPOST http://masternode:9200/_bulk --data-binary @requests; {"took":296,"errors":false,"items":[{"index":{"_index":"zimo","_type":"user","_id":"6","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"status":201}},{"update":{"_index":"zimo","_type":"user","_id":"6","_version":2,"_shards":{"total":2,"successful":2,"failed":0},"status":200}}]}
bulk請求可以在URL中聲明/_indexhuozhe /_-index/_type.
bulk一次最大可以處理多少數據量:
1)bulk會把將要處理的數據載入內存中,所以數據量是有限的;
2)最佳的數據量不是一個確定的數值,它取決於你的硬件,你的文檔大小以及復雜性,你的索引以及搜索的負載;
3)一般建議是1000-5000個文檔,如果你的文檔很大,可以適當減少隊列,大小建議是5-15M,默認不能超過100M,可以在ES的配置文件中修改這個值http.max_content_length:100mb;
4)https://www.elastic.co/guide/en/elasticsearch/reference/2.4/moudles-http.html。
ElasticSearch-CURL命令-版本控制
普通關系型數據庫使用的是PCC(悲觀並發控制):當我們在修改一個數據前先鎖定這一行,然后確保只有讀取到的這個線程可以修改這一行數據。
ES使用的是OCC(樂觀並發控制):ES不會阻止某一數據的訪問。然而,如果基礎數據在我們讀取和寫入的間隔中發生了變化,更新就會失敗,這時候就由程序來決定如何處理這個沖突。它可以重新讀取數據來進行更新,又或者將這一情況最直接反饋給用戶。
ES如何實行版本控制?(使用ES內部版本號)
1)首先需要修改的文檔,獲取版本號(_version)
[hadoop@masternode elasticsearch-2.4.0]$ curl –XGET http://masternode:9200/zimo/user/2 {"_index":"zimo","_type":"user","_id":"2","_version":1,"found":true,"_source":{"name" : "john", "age" : 28}}
2)在執行更新操作的時候把版本號傳過去
[hadoop@masternode elasticsearch-2.4.0]$ curl http://masternode:9200/zimo/user/2?version=1 -d '{"name":"john1","age":29}' {"_index":"zimo","_type":"user","_id":"2","_version":2,"_shards":{"total":2,"successful":2,"failed":0},"created":false}
該操作可以重復執行,每執行一次版本號都會+1。
3)如果傳遞的版本號和待更新的版本號不一致,更新操作將會失敗。