Elasticsearch(二)基礎API
叢集健康
curl localhost:9200/_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 1535619893 17:04:53 elasticsearch yellow 1 1 10 10 0 0 10 0 - 50.0%
可以看到:
1、叢集名稱為預設的"elasticsearch"
2、叢集狀態為"yellow",總共有三種狀態:“green”,“yellow”,“red”
列出所有索引
curl 'localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open weather NjoTuy-yTzihSe4UKq81Ug 5 1 0 0 1.2kb 1.2kb yellow open cbm PFM_LEfKRbyhhpGjUex0Fg 5 1 20 0 97.6kb 97.6kb
可以看到:
1、叢集中已經有兩個索引,分別是:weather和cbm。
2、每個索引有5個主分片和一個複製(預設)。
3、其中cbm的索引下又20個文件。
建立一個索引
curl -XPUT 'localhost:9200/blog?pretty'
然後列出所有索引,就會發現索引已經建立好
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open weather NjoTuy-yTzihSe4UKq81Ug 5 1 0 0 1.2kb 1.2kb yellow open blog EsUfJEW2TF2RySj8Rdq8jw 5 1 0 0 460b 460b yellow open cbm PFM_LEfKRbyhhpGjUex0Fg 5 1 20 0 97.6kb 97.6kb
建立文件
curl -XPUT 'localhost:9200/blog/user/2?pretty' -d '
{
"name": "march"
}'
{
"error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
"status" : 406
}
Starting from Elasticsearch 6.0, all REST requests that include a body must also provide the correct content-type for that body. 自6.0版本之後需要做content-type檢查(如果不加就會報以上406錯誤),所以請求是加上content-type,修改請求如下:
curl -XPUT -H "Content-Type: application/json" 'localhost:9200/blog/user/2?pretty' -d '
{
"name": "march kooola"
}'
請求返回如下:
{
"_index" : "blog",
"_type" : "user",
"_id" : "2",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
解釋下這個"localhost:9200/blog/user/2?pretty" :
1、blog為索引(index)
2、user為型別(type)
3、數字2表示文件的id,這裡指定了該文件的id為2
4、請求返回中可以看到,版本號為1,result為新建(create)
接下來再把剛才的請求重新請求,修改下name
curl -XPUT -H "Content-Type: application/json" 'localhost:9200/blog/user/2?pretty' -d '
{
"name": "ZWQ"
}'
可以看到請求返回如下:
{
"_index" : "blog",
"_type" : "user",
"_id" : "2",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
id還是2,版本號變成2,result型別變成更新(update)
在索引的時候,ID部分是可選的。如果不指定,Elasticsearch將產生一個隨機的ID來索引這個文件。Elasticsearch 生成的ID會作為索引API呼叫的一部分被返回。
查詢一個文件
curl -XGET 'localhost:9200/blog/user/2?pretty'
該請求查詢索引為blog,型別為user,文件id為2的文件 請求返回如下:
{
"_index" : "blog",
"_type" : "user",
"_id" : "2",
"_version" : 2,
"found" : true,
"_source" : {
"name" : "ZWQ"
}
}
可以看到,查詢到的文件name為ZWQ(更新後的值)
刪除文件
curl -XDELETE 'localhost:9200/blog/user/2?pretty'
以上命令刪除索引為blog,型別為user,文件id為2的文件 此時再查詢該文件,返回就會告訴我們該文件找不到(found為false)
curl -XGET 'localhost:9200/blog/user/2?pretty'
{
"_index" : "blog",
"_type" : "user",
"_id" : "2",
"found" : false
}
更新文件
除了可以索引、替換文件之外,我們也可以更新一個文件。但要注意,Elasticsearch底層並不支援原地更新。在我們想要做一次更新的時候,Elasticsearch先刪除舊文件,然後再索引更新的新文件。
下面的例子展示了怎樣將ID為2的文件的name欄位改成“zhangweiqing”:
curl -XPOST -H "Content-Type: application/json" 'localhost:9200/blog/user/2/_update?pretty' -d '
{
"doc": { "name": "zhangweiqing" }
}'
下面的例子展示了怎樣將ID為2的文件的name欄位改成“mouse”的同時,給它加上age欄位:
curl -XPOST -H "Content-Type: application/json" 'localhost:9200/blog/user/2/_update?pretty' -d '
{
"doc": { "name": "mouse", "age": 28 }
}'
更新也可以通過使用簡單的指令碼來進行。這個例子使用一個指令碼將age加1(ctx._source指向當前被更新的文件):
curl -XPOST -H "Content-Type: application/json" 'localhost:9200/blog/user/2/_update?pretty' -d '
{
"script" : "ctx._source.age += 1"
}'