1. 程式人生 > >Elasticsearch(二)基礎API

Elasticsearch(二)基礎API

elasticsearch

叢集健康

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