前面我們介紹了一些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*
或*test
或te*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": {} } } '
請求執行結果如下:
好了,本文就先介紹到這裏,有問題歡迎留言討論。