elasticsearch API約定(一)

前面我們介紹了一些REST API的基本用法,使讀者對API的使用有了一個直觀的瞭解,本文我們來介紹下Elasticsearch中的API約定,這些約定適用於大部分的REST API,在後面文章的介紹中,除非另有說明,否則本文所介紹的API約定都將適用於相應的API。

本文是Elasticsearch系列的第五篇,閱讀前面的文章,有助於更好的理解本文:


1.elasticsearch安裝與配置 2.初識elasticsearch中的REST接口 3.elasticsearch修改數據 4.elasticsearch文檔操作


多個索引

在前面的查詢案例中,我們使用的都是單個索引,實際上Elasticsearch也支持多個索引查詢,在多個索引查詢中,Elasticsearch支持如下幾種方式:

  • 支持使用簡單表示法,如test1,test2,test3表示法
  • 使用_all表示所有索引
  • 使用通配符,如 test**testte*t*test*
  • 也支持排除能力,例如:test*,-test3

在所有的多索引API中都支持以下URL查詢參數:

ignore_unavailable

這個參數表示,當指定多個索引時,如果有索引不可用(不存在或者已經關閉)那麼是否忽略該索引。true表示忽略,false表示不忽略,默默認爲false。 例如如下請求表示查看索引bank和索引bank2中的文檔(實際上bank2不存在):

curl -X GET "localhost:9200/bank,bank2/_search?q=*&sort=account_number:asc&pretty"

該請求執行結果如下:

可以看到,由於bank2這個索引不存在,因此執行失敗,如果加上ignore_unavailable參數則可以執行成功,如下:

curl -X GET "localhost:9200/bank,bank2/_search?q=*&sort=account_number:asc&pretty&ignore_unavailable=true"

執行結果如下:

allownoindices

這個參數表示如果查詢的時候使用了通配符,但是通配符沒有匹配到任何索引,此時是否查詢失敗?該參數默認值爲true,表示允許通配符匹配不到任何索引,例如如下請求:

curl -X GET "localhost:9200/bank3*/_search?q=*&pretty"

實際上,bank3索引是不存在的,但是該請求執行並未報錯,如下:

這是因爲默認是允許通配符匹配不到任何索引的,如果加上 allow_no_indices參數,並將之設置爲false,即不允許通配符匹配不到任何索引,此時再去執行就會報錯,如下:

curl -X GET "localhost:9200/bank3*/_search?q=*&pretty&allow_no_indices=false"

執行結果如下:

如果別名指向關閉索引,則此設置也適用於別名。

expand_wildcards

expand_wildcards表示查詢索引的範圍,open表示查詢所有匹配並open的索引,closed則表示查詢所有匹配的索引,如下:

假設bank關閉,bank2未關閉,執行如下查詢:

curl -X GET "localhost:9200/bank*/_search?pretty&expand_wildcards=open"

此時,只會展示open的索引信息,如下:

而如果執行如下查詢:

curl -X GET "localhost:9200/bank*/_search?pretty&expand_wildcards=closed"

結果如下:

索引名中的日期數學支持

Date math索引名稱解析可以讓開發者搜索一系列time-series indices(時間序列索引),而不用搜索所有時間序列索引然後過濾結果或者維護aliases(別名)。這種方式限制了搜索的索引數量並且減少了集羣上的負載,並提高了執行性能。例如,如果使用Elasticsearch來記錄軟件運行日誌,如果想要查看過去兩天的日誌信息,則可以使用date math name模板將搜索索引限制爲過去兩天。 幾乎所有的具有索引參數的API都支持在index parameter value(索引參數值)中包含 date math。date math索引名稱採用以下形式 :

<static_name{date_math_expr{date_format|time_zone}}>

上述模版說明:

模版

中文含義

static_name

索引名稱中的靜態文本部分

datemathexpr

動態計算日期的date math表達式

date_format

日期的顯示格式,默認爲YYYY.MM.dd

time_zone

可選的時區,默認爲utc

date_math索引名稱表達式必須包含在尖括號中,並且所有特殊字符都需要進行URL編碼,例如如下請求:

GET /<logstash-{now/d}>/_search

編碼後的請求格式爲:

curl -X GET "localhost:9200/%3Clogstash-%7Bnow%2Fd%7D%3E/_search" -H 'Content-Type: application/json' -d'
{
  "query" : {
    "match": {
      "test": "data"
    }
  }
}
'

編碼格式表如下:

%3C

下面是幾個解析案例,供讀者參考,設置當前的默認時間爲2024年3月22日中午utc。

logstash-2024.03.22

如果想要在索引名稱的靜態部分使用 {},則可以使用 \進行轉義,如下:

<elastic\\{ON\\}-{now/M}>

最終結果爲:

elastic{ON}-2024.03.01

Demo

例如現在有如下3個過去三天的日誌索引:

想要查詢過去兩天的日誌索引:

GET /<log-{now/d-1d}>,<log-{now/d}>/_search

查詢請求如下:

curl -X GET "localhost:9200/%3Clog-%7Bnow%2Fd-1d%7D%3E%2C%3Clog-%7Bnow%2Fd%7D%3E/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query" : {
    "match_all": {}
  }
}
'

請求執行結果如下:

好了,本文就先介紹到這裏,有問題歡迎留言討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章