1. 程式人生 > >Elasticsearch增刪改查

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\""
}'