Elasticsearch - API 約定



Web 應用中的應用程式程式設計介面 (API) 是一組函式呼叫或其他程式設計指令,用於訪問特定 Web 應用程式中的軟體元件。例如,Facebook API 幫助開發者透過訪問 Facebook 的資料或其他功能(例如生日或狀態更新)來建立應用程式。

Elasticsearch 提供了一個 REST API,它透過 HTTP 上的 JSON 進行訪問。Elasticsearch 使用一些約定,我們現在將討論這些約定。

多個索引

大多數 API 操作,主要是搜尋和其他操作,都是針對一個或多個索引進行的。這有助於使用者只需執行一次查詢即可搜尋多個位置或所有可用資料。許多不同的表示法用於在多個索引中執行操作。我們將在本章中討論其中一些。

逗號分隔表示法

POST /index1,index2,index3/_search

請求體

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

響應

來自 index1、index2、index3 的 JSON 物件,其中包含 any_string。

_all 關鍵字用於所有索引

POST /_all/_search

請求體

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

響應

來自所有索引的 JSON 物件,其中包含 any_string。

萬用字元 (* , + , –)

POST /school*/_search

請求體

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

響應

所有以 school 開頭的索引中的 JSON 物件,其中包含 CBSE。

或者,您也可以使用以下程式碼:

POST /school*,-schools_gov /_search

請求體

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

響應

所有以“school”開頭但不是 schools_gov 的索引中的 JSON 物件,其中包含 CBSE。

還有一些 URL 查詢字串引數:

  • ignore_unavailable - 如果 URL 中存在的一個或多個索引不存在,則不會發生錯誤或不會停止操作。例如,schools 索引存在,但 book_shops 不存在。

POST /school*,book_shops/_search

請求體

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

請求體

{
   "error":{
      "root_cause":[{
         "type":"index_not_found_exception", "reason":"no such index",
         "resource.type":"index_or_alias", "resource.id":"book_shops",
         "index":"book_shops"
      }],
      "type":"index_not_found_exception", "reason":"no such index",
      "resource.type":"index_or_alias", "resource.id":"book_shops",
      "index":"book_shops"
   },"status":404
}

考慮以下程式碼:

POST /school*,book_shops/_search?ignore_unavailable = true

請求體

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

響應(無錯誤)

所有以 school 開頭的索引中的 JSON 物件,其中包含 CBSE。

allow_no_indices

此引數的 true 值將阻止錯誤,如果帶有萬用字元的 URL 導致沒有索引。例如,沒有以 schools_pri 開頭的索引:

POST /schools_pri*/_search?allow_no_indices = true

請求體

{
   "query":{
      "match_all":{}
   }
}

響應(無錯誤)

{
   "took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0},
   "hits":{"total":0, "max_score":0.0, "hits":[]}
}

expand_wildcards

此引數決定是否需要將萬用字元擴充套件到開啟的索引或關閉的索引,或兩者都執行。此引數的值可以是 open 和 closed 或 none 和 all。

例如,關閉索引 schools:

POST /schools/_close

響應

{"acknowledged":true}

考慮以下程式碼:

POST /school*/_search?expand_wildcards = closed

請求體

{
   "query":{
      "match_all":{}
   }
}

響應

{
   "error":{
      "root_cause":[{
         "type":"index_closed_exception", "reason":"closed", "index":"schools"
      }],
      "type":"index_closed_exception", "reason":"closed", "index":"schools"
   }, "status":403
}

索引名稱中的日期數學支援

Elasticsearch 提供了一種根據日期和時間搜尋索引的功能。我們需要以特定格式指定日期和時間。例如,accountdetail-2015.12.30 索引將儲存 2015 年 12 月 30 日的銀行賬戶詳細資訊。可以執行數學運算以獲取特定日期或日期和時間範圍的詳細資訊。

日期數學索引名稱的格式:

<static_name{date_math_expr{date_format|time_zone}}>
/<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search

static_name 是表示式的一部分,在每個日期數學索引(如 account detail)中保持不變。date_math_expr 包含確定日期和時間的動態表示式,例如 now-2d。date_format 包含索引中日期的書寫格式,例如 YYYY.MM.dd。如果今天的日期是 2015 年 12 月 30 日,則 <accountdetail-{now-2d{YYYY.MM.dd}}> 將返回 accountdetail-2015.12.28。

表示式 解析為
<accountdetail-{now-d}> accountdetail-2015.12.29
<accountdetail-{now-M}> accountdetail-2015.11.30
<accountdetail-{now{YYYY.MM}}> accountdetail-2015.12

我們現在將瞭解 Elasticsearch 中的一些常用選項,這些選項可用於以指定格式獲取響應。

漂亮的結果

我們可以透過附加一個 URL 查詢引數(即 pretty = true)來以格式良好的 JSON 物件獲取響應。

POST /schools/_search?pretty = true

請求體

{
   "query":{
      "match_all":{}
   }
}

響應

……………………..
{
   "_index" : "schools", "_type" : "school", "_id" : "1", "_score" : 1.0,
   "_source":{
      "name":"Central School", "description":"CBSE Affiliation",
      "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115",
      "location": [31.8955385, 76.8380405], "fees":2000,
      "tags":["Senior Secondary", "beautiful campus"], "rating":"3.5"
   }
}
………………….

人類可讀的輸出

此選項可以將統計響應更改為人機可讀形式(如果 human = true)或計算機可讀形式(如果 human = false)。例如,如果 human = true,則 distance_kilometer = 20KM;如果 human = false,則 distance_meter = 20000,當響應需要由另一個計算機程式使用時。

響應過濾

我們可以透過在 field_path 引數中新增它們來過濾響應到較少的欄位。例如,

POST /schools/_search?filter_path = hits.total

請求體

{
   "query":{
      "match_all":{}
   }
}

響應

{"hits":{"total":3}}
廣告
© . All rights reserved.