1.rest基本介紹html
REST全稱Representational State Transfer。是一種軟件的架構風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件能夠更簡潔,更有層次,更易於實現緩存等機制。其實說白了就是相似HTTP的訪問,和HTTP很是的類似。java
rest相關操做有:
數據庫
-GET:獲取對象的當前狀態;apache
-PUT:改變對象的狀態;json
-POST:建立對象;centos
-DELETE:刪除對象;緩存
-HEAD:獲取頭信息; 服務器
例:網絡
資源 | 一組資源的URI,好比:http://zzy.com/res/架構 |
單個資源的URI,好比:http://z.com/res/123 |
GET | 列出URI,以及該資源組中每一個資源的詳細信息 |
獲取指定資源的詳細信息,格式能夠自選一個合適的網絡資源媒體類型(json、xml) |
PUT | 使用給定的一組資源替換當前整組資源 | 替換/建立指定資源,並將其追加到相應的資源中 |
POST | 在本組資源中建立/追加一個新的資源,該操做每每返回一個新的URL |
把指定的資源當作一個資源組,並在其下建立/追加一個新的元素,使其隸屬於當前資源 |
DELETE | 刪除整組資源 |
刪除指定的元素 |
ES中內置的rest接口:
URL |
描述 |
/index/_search |
搜索指定索引下的數據 |
/_aliases |
獲取或操做索引的別名 |
/index/ |
查看指定索引的詳細信息 |
/index/type/ |
建立或操做類型 |
/index/_mapping |
建立或操做mapping |
/index/_setting |
建立或操做設置(number_of_shards) |
/index/_open |
打開指定被關閉的索引 |
/index/_close |
關閉指定索引 |
/index/_refresh |
刷新索引(使新加內容對搜索可見,不保證數據被寫入磁盤) |
/index/flush |
刷新索引(會觸發Lucene提交) |
2.使用CURL去操做ES
url是利用URL語法在命令行方式下工做的開源文件傳輸工具,使用curl能夠簡單實現常見的get/post請求。簡單的認爲是能夠在命令行下面訪問url的一個工具。在centos的默認庫裏面是有curl工具的,若是沒有請yum安裝便可。
curl的基本操做:
Ø -x 指定http的請求方法 有HEAD GET POST PUT DELETE
Ø -d 指定要傳輸的數據
Ø -H 指定http請求頭信息
(1)建立索引庫
語法:curl -XPUT http://<ip>:9200/index_name/
例:curl -XPUT 'http://test:9200/zzy'
(2)建立索引
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/zzy/info/1' -d ' {"name":"hadoop", "author":"Doug Cutting", "core":["hdfs","mr","yarn"], "last_version":3.0 }'
在這裏對初學者小編須要補充幾點:
PUT和POST的區別:
PUT是冪等方法,POST不是。因此PUT用戶更新,POST用於新增比較合適。建立操做可使用POST,也可使用PUT,區別就在於POST是做用在一個集合資源(/articles)之上的,而PUT操做是做用在一個具體資源之上的(/articles/123),好比說不少資源使用數據庫自增主鍵做爲標識信息,這個時候就須要使用PUT了。而建立的資源的標識信息究竟是什麼,只能由服務端提供時,這個時候就必須使用POST。
ES建立索引庫和索引的注意點:
* 索引庫名稱必需要所有小寫,不能如下劃線開頭,也不能包含逗號。
* 若是沒有明確指定索引數據的ID,那麼es會自動生成一個隨機的ID,須要使用POST參數。
例:(不指定id)
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/zzy/info/' -d ' {"author" : "Doug Cutting"}'
例:(建立全新的數據)
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/zzy/info/2?op_type=create' -d ' {"name" : "hbase"}'
(3)查詢操做
例1(查詢全部):
curl -XGET //注意?pretty表示讓出現的json好看一些
例2:(檢索文檔中的一部分,顯示特定的字段內容)
curl -XGET 'http://test:9200/zzy/info/1?_source=name,author&pretty'
例3:(根據條件查詢)
curl -XGET 'http://test:9200/zzy/info/_search?q=name=hadoop&pretty'
(4)更新操做
ES可使用PUT/GET對文檔進行更新,若是指定ID的文檔已經存在,則執行更新操做。
ES在執行更新操做的時候,首先將舊的文檔標記爲刪除狀態,而後添加新的文檔,舊的文檔不會當即消失,可是也沒法訪問,ES會繼續添加更多數據的時候在後臺清理已經標記刪除狀態的文檔。
例:(局部更新)
curl -H "Content-Type: application/json" -XPOST http://test:9200/zzy/info/1/_update -d '{ "doc":{"name" : "apache-hadoop"} }' //注意:"doc":{"name" : "apache-hadoop"}能夠執行更新,也能夠執行插入。
(5)刪除操做
例:(普通刪除,根據id刪除)
curl -XDELETE http://test:9200/zzy/info/2/
注意:
若是文檔存在,es屬性found:true,successful:1,_version屬性的值+1。
若是文檔不存在,es屬性found爲false,可是版本值version依然會+1,這個就是內部管理的一部分,有點像svn版本號,它保證了咱們在多個節點間的不一樣操做的順序被正確標記了。
一個文檔被刪除以後,不會當即生效,他只是被標記爲已刪除。ES將會在你以後添加更多索引的時候纔會在後臺進行刪除。
(6)bulk操做
例:
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/bank/accout/_bulk?pretty' --data-binary "@account.json"
Bulk會把將要處理的數據載入內存中,因此一次批處理的數據量是有限的,通常建議是1000~5000個文檔,若是你的文檔很大,能夠適當減小隊列,大小建議是5~15MB,默認不能超過100M,能夠在es的配置文件中修改這個值:http.max_content_length:100mb
3.ES的版本控制
(1)普通數據庫和ES的控制數據讀取的策略:
普通的關係型數據庫使用的時候是當咱們讀取一個數據前先鎖定這一行,而後確保只有讀到數據的這個線程能夠修改這一行。而ES使用的是(樂觀併發控制),ES不會阻止某一個數據的訪問,若是基礎數據在咱們讀取和寫入的間隔中發生了變化,更新就會失敗,這時候由程序來決定如何處理這個衝突,能夠是從新讀取更新後的數據,也可能將這個失敗狀況直接反饋給用戶。
(2)ES實現版本控制:
//首先獲得須要修改的文檔,獲取版本號 curl -XGET http://test:9200/zzy/info/1?pretty
//而後在執行更新操做的時候把版本傳過去 curl -H "Content-Type: application/json" -XPUT http://test:9200/zzy/info/1?version=2 -d '{ "name":"hadoop","version":4}' //注意這是個覆蓋操做
注意:若是傳遞的版本號和待更新的文檔的版本號不一致,則會更新失敗
(3)ES外部版本:
若是數據庫已經存在了版本號,或者是能夠表明版本的時間戳,這時就能夠在ES的查詢url後面添加version_type=external來使用這個號。版本號碼必需要是大於0小於9223372036854775807(Java中long的最大正值)的整數。而且es在處理外部版本號的時候,它再也不檢查_version是否與請求中指定的數值是否相等,而是檢查當前的_version是否比指定的數值小,若是小,則請求成功。
例:
curl -H "Content-Type: application/json" -XPUT 'http://test:9200/zzy/info/3?version=10&version_type=external' -d ' {"name": "flink"}'