Elasticsearch增刪改查
增刪改查
增刪改查是資料庫的基礎操作方法。ES 雖然不是資料庫,但是很多場合下,都被人們當做一個文件型 NoSQL 資料庫在使用,原因自然是因為在介面和分散式架構層面的相似性。雖然在 Elastic Stack 場景下,資料的寫入和查詢,分別由 Logstash 和 Kibana 代勞,作為測試、調研和排錯時的基本功,還是需要了解一下 ES 的增刪改查用法的。
資料寫入
ES 的一大特點,就是全 RESTful 介面處理 JSON 請求。所以,資料寫入非常簡單:
# curl -XPOST http://127.0.0.1:9200/logstash-2015.06.21/testlog -d '{ "date" : "1434966686000", "user" : "chenlin7", "mesg" : "first message into Elasticsearch" }'
命令返回響應結果為:
{"_index":"logstash-2015.06.21","_type":"testlog","_id":"AU4ew3h2nBE6n0qcyVJK","_version":1,"created":true}
資料獲取
可以看到,在資料寫入的時候,會返回該資料的 _id
。這就是後續用來獲取資料的關鍵:
# curl -XGET http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK
命令返回響應結果為:
{"_index":"logstash-2015.06.21","_type":"testlog","_id":"AU4ew3h2nBE6n0qcyVJK","_version":1,"found":true,"_source":{ "date" : "1434966686000", "user" : "chenlin7", "mesg" : "first message into Elasticsearch" }}
這個 _source
裡的內容,正是之前寫入的資料。
如果覺得這個返回看起來有點太過麻煩,可以使用 curl -XGET http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK/_source
來指明只獲取源資料部分。
更進一步的,如果你只想看資料中的一部分欄位內容,可以使用 curl -XGET http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK?fields=user,mesg
來指明獲取欄位,結果如下:
{"_index":"logstash-2015.06.21","_type":"testlog","_id":"AU4ew3h2nBE6n0qcyVJK","_version":1,"found":true,"fields":{"user":["chenlin7"],"mesg":["first message into Elasticsearch"]}}
資料刪除
要刪除資料,修改傳送的 HTTP 請求方法為 DELETE 即可:
# curl -XDELETE http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK
刪除不單針對單條資料,還可以刪除整個整個索引。甚至可以用萬用字元。
# curl -XDELETE http://127.0.0.1:9200/logstash-2015.06.0*
在 Elasticsearch 2.x 之前,可以通過查詢語句刪除,也可以刪除某個 _type
內的資料。現在都已經不再內建支援,改為 Delete by Query
外掛。因為這種方式本身對效能影響較大!
資料更新
已經寫過的資料,同樣還是可以修改的。有兩種辦法,一種是全量提交,即指明 _id
再發送一次寫入請求。
# curl -XPOST http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK -d '{
"date" : "1434966686000",
"user" : "chenlin7",
"mesg" " "first message into Elasticsearch but version 2"
}'
另一種是區域性更新,使用 /_update
介面:
# curl -XPOST 'http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK/_update' -d '{
"doc" : {
"user" : "someone"
}
}'
或者
# curl -XPOST 'http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK/_update' -d '{
"script" : "ctx._source.user = \"someone\""
}'