簡單認為是可以在命令行下訪問url的一個工具
curl是利用URL語法在命令行方式下工作的開源文件傳輸工具,使用curl可以簡單實現常見的get/post請求。
curl
-X 指定http請求的方法
HEAD GET POST PUT DELETE
-d 指定要傳輸的數據
比如:curl -XHEAD 'https://www.baidu.com'
CURL建立索引庫
curl -XPUT 'http://localhost:9200/index_name/'
例如:curl -XPUT 'http://master:9200/hello/'
PUT/POST都可以
CURL創建索引
創建索引,例如:其中employee是type,1是document,-d是指定要傳輸的數據
curl -XPOST http://master:9200/hello/employee/1 -d '{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}'
PUT 和POST用法
PUT是冪等方法,POST不是。所以PUT用於更新、POST用於新增比較合適。
PUT,DELETE操作是冪等的。所謂冪等是指不管進行多少次操作,結果都一樣。比如我用PUT修改一篇文章,然后在做同樣的操作,每次操作后的結果並沒有不同,DELETE也是一樣。
POST操作不是冪等的,比如常見的POST重復加載問題:當我們多次發出同樣的POST請求后,其結果是創建出了若干的資源。
還有一點需要注意的就是,創建操作可以使用POST,也可以使用PUT,區別在於POST是作用在一個集合資源之上的/articles),而PUT操作是作用在一個具體資源之上的(/articles/123),比如說很多資源使用數據庫自增主鍵作為標識信息,而創建的資源的標識信息到底是什么只能由服務端提供,這個時候就必須使用POST。
創建索引注意事項
索引庫名稱必須要全部小寫,不能以下划線開頭,也不能包含逗號
如果沒有明確指定索引數據的ID,那么es會自動生成一個隨機的ID,需要使用POST參數
curl -XPOSThttp://localhost:9200/hello/emp/ -d '{"first_name" : "John"}'
如果想要確定我們創建的都是全新的內容
1:使用自增ID
2:在url后面添加參數
curl -XPUT http://localhost:9200/hello/emp/2?op_type=create-d '{"name":“zs","age":25}'
curl -XPUT http://localhost:9200/hello/emp/2/_create-d '{"name":“laoxiao","age":25}'
如果成功創建了新的文檔,Elasticsearch將會返回常見的元數據以及201 Created的HTTP反饋碼。而如果存在同名文件,Elasticsearch將會返回一個409 Conflict的HTTP反饋碼
------------------------------------------------------------------------------------------------------------------------------
GET查詢索引
根據員工id查詢
curl -XGET http://localhost:9200/hello/employee/1?pretty
在任意的查詢字符串中添加pretty參數,es可以得到易於識別的json結果。
curl后添加-i 參數,這樣就能得到反饋頭文件
curl -i 'http://192.168.1.170:9200/hello/emp/1?pretty'
檢索文檔中的一部分,如果只需要顯示指定字段,
curl -XGET http://localhost:9200/hello/employee/1?_source=name,age
如果只需要source的數據
curl –XGET http://localhost:9200/hello/employee/1/_source
查詢所有
curl -XGET http://localhost:9200/hello/employee/_search
可以再返回的hits 中發現已經錄入的文檔。搜索會默認返回最前的10個數值。
根據條件進行查詢
curl -XGET http://localhost:9200/elasticsearch/employee/_search?q=last_name:Smith
------------------------------------------------------------------------------------------------------------------------------
DSL查詢
Domain Specific Language
領域特定語言
curl -XGET http://localhost:9200/hello/employee/_search -d
'{"query":
{"match":
{"last_name":"Smith"}
}
}'
------------------------------------------------------------------------------------------------------------------------------
MGET查詢
使用mget API獲取多個文檔
curl -XGET http://localhost:9200/_mget?pretty -d '{"docs":[{"_index":“hello","_type":"emp","_id":2,"_source":"name"},{"_index":"website","_type":"blog","_id":2}]}'
如果你需要的文檔在同一個_index或者同一個_type中,你就可以在URL中指定一個默認的/_index或者/_index/_type
curl -XGET http://localhost:9200/hello/emp/_mget?pretty -d '{"docs":[{"_id":1},{"_type":"blog","_id":2}]}'
如果所有的文檔擁有相同的_index 以及_type,直接在請求中添加ids的數組即可。
curl -XGET http://localhost:9200/hello/emp/_mget?pretty -d '{"ids":["1","2"]}'
注意:如果請求的某一個文檔不存在,不會影響其他文檔的獲取結果。HTTP返回狀態碼依然是200,這是因為mget這個請求本身已經成功完成。要確定獨立的文檔是否被成功找到,需要檢查found標識。
------------------------------------------------------------------------------------------------------------------------------
HEAD使用
如果只想檢查一下文檔是否存在,你可以使用HEAD來替代GET方法,這樣就只會返回HTTP頭文件
curl -i -XHEAD http://localhost:9200/hello/emp/1
------------------------------------------------------------------------------------------------------------------------------
Elasticsearch的更新
ES可以使用PUT或者POST對文檔進行更新,如果指定ID的文檔已經存在,則執行更新操作
注意:執行更新操作的時候
ES首先將舊的文檔標記為刪除狀態
然后添加新的文檔
舊的文檔不會立即消失,但是你也無法訪問
ES會在你繼續添加更多數據的時候在后台清理已經標記為刪除狀態的文檔
局部更新,可以添加新字段或者更新已有字段(必須使用POST)
curl -XPOSThttp://localhost:9200/hello/emp/1/_update -d '{"doc":{"city":"beijing","car":"BMW"}}'
------------------------------------------------------------------------------------------------------------------------------
Elasticsearch的刪除
curl -XDELETE http://localhost:9200/hello/emp/4/
如果文檔存在,es會返回200 ok的狀態碼,found屬性值為true,_version屬性的值+1
found屬性值為false,但是_version屬性的值依然會+1,這個就是內部管理的一部分,它保證了我們在多個節點間的不同操作的順序都被正確標記了
注意:刪除一個文檔也不會立即生效,它只是被標記成已刪除。Elasticsearch將會在你之后添加更多索引的時候才會在后台進行刪除內容的清理
通過查詢API刪除指定索引庫下指定類型下的數據
curl -XDELETE 'http://localhost:9200/hello/emp/_query?q=user:kimchy'
curl -XDELETE 'http://localhost:9200/hello/emp/_query' -d '{
"query" : {
"term" : { "user" : "kimchy" }
}
}'
通過查詢API刪除指定索引庫下多種類型下的數據
curl -XDELETE 'http://localhost:9200/hello/emp,user/_query?q=user:kimchy‘
通過查詢API刪除多個索引庫下多種類型下的數據
curl -XDELETE 'http://localhost:9200/hello,index/emp,user/_query?q=user:kimchy'
或者刪除所有索引庫中的匹配的數據
curl -XDELETE 'http://localhost:9200/_all/_query?q=tag:wow'
------------------------------------------------------------------------------------------------------------------------------
與mget類似,bulk API可以幫助我們同時執行多個請求
格式:
action:index/create/update/delete
metadata:_index,_type,_id
request body:_source(刪除操作不需要)
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
使用curl -XPOST -d 時注意,不能直接在json字符串中添加\n字符,應該按回車
create 和index的區別
如果數據存在,使用create操作失敗,會提示文檔已經存在,使用index則可以成功執行。
使用文件的方式
vi requests
curl -XPOST/PUT localhost:9200/_bulk --data-binary@request;
bulk請求可以在URL中聲明/_index 或者/_index/_type
bulk一次最大處理多少數據量
bulk會把將要處理的數據載入內存中,所以數據量是有限制的
最佳的數據量不是一個確定的數值,它取決於你的硬件,你的文檔大小以及復雜性,你的索引以及搜索的負載
一般建議是1000-5000個文檔,如果你的文檔很大,可以適當減少隊列,大小建議是5-15MB,默認不能超過100M,可以在es的配置文件中修改這個值http.max_content_length: 100mb
------------------------------------------------------------------------------------------------------------------------------
Elasticsearch的版本控制
普通關系型數據庫使用的是(悲觀並發控制(PCC))
當我們在讀取一個數據前先鎖定這一行,然后確保只有讀取到數據的這個線程可以修改這一行數據
ES使用的是(樂觀並發控制(OCC))
ES不會阻止某一數據的訪問,然而,如果基礎數據在我們讀取和寫入的間隔中發生了變化,更新就會失敗,這時候就由程序來決定如何處理這個沖突。它可以重新讀取新數據來進行更新,又或者將這一情況直接反饋給用戶。
ES如何實現版本控制(使用es內部版本號)
1:首先得到需要修改的文檔,獲取版本(_version)號
curl -XGET http://localhost:9200/elasticsearch/emp/1
2:在執行更新操作的時候把版本號傳過去
curl -XPUT http://localhost:9200/elasticsearch/emp/1?version=1 -d '{"name":“zs","age":25}'(覆蓋)
curl -XPOST http://localhost:9200/elasticsearch/emp/1/_update?version=1 -d '{"doc":{"city":"beijing","car":"BMW"}}'(部分更新)
3:如果傳遞的版本號和待更新的文檔的版本號不一致,則會更新失敗
ES如何實現版本控制(使用外部版本號)
如果你的數據庫已經存在了版本號,或者是可以代表版本的時間戳。這時就可以在es的查詢url后面添加version_type=external來使用這些號碼。
注意:版本號碼必須要是大於0小於9223372036854775807(Java中long的最大正值)的整數。
es在處理外部版本號的時候,它不再檢查_version是否與請求中指定的數值是否相等,而是檢查當前的_version是否比指定的數值小,如果小,則請求成功。
example:
curl -XPUT ‘http://localhost:9200/hello/emp/20?version=10&version_type=external’-d ‘{“name”: “laoxiao"}'
注意:此處url前后的引號不能省略,否則執行的時候會報錯。
