Elasticsearch - Convenzioni API
L'API (Application Programming Interface) nel web è un gruppo di chiamate di funzione o altre istruzioni di programmazione per accedere al componente software in quella particolare applicazione web. Ad esempio, l'API di Facebook aiuta uno sviluppatore a creare applicazioni accedendo ai dati o ad altre funzionalità da Facebook; può essere data di nascita o aggiornamento dello stato.
Elasticsearch fornisce un'API REST, a cui si accede da JSON su HTTP. Elasticsearch utilizza alcune convenzioni che discuteremo ora.
Indici multipli
La maggior parte delle operazioni, principalmente ricerca e altre operazioni, nelle API sono per uno o più indici. Questo aiuta l'utente a cercare in più posti o in tutti i dati disponibili semplicemente eseguendo una query una volta. Molte notazioni diverse vengono utilizzate per eseguire operazioni in più indici. Ne discuteremo alcuni qui in questo capitolo.
Notazione separata da virgole
POST /index1,index2,index3/_search
Corpo della richiesta
{
"query":{
"query_string":{
"query":"any_string"
}
}
}
Risposta
Oggetti JSON da index1, index2, index3 che contengono any_string.
_all parola chiave per tutti gli indici
POST /_all/_search
Corpo della richiesta
{
"query":{
"query_string":{
"query":"any_string"
}
}
}
Risposta
Oggetti JSON da tutti gli indici e contenenti any_string.
Caratteri jolly (*, +, -)
POST /school*/_search
Corpo della richiesta
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Risposta
Oggetti JSON da tutti gli indici che iniziano con la scuola contenente CBSE.
In alternativa, puoi utilizzare anche il seguente codice:
POST /school*,-schools_gov /_search
Corpo della richiesta
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Risposta
Oggetti JSON da tutti gli indici che iniziano con "school" ma non da schools_gov e che contengono CBSE.
Esistono anche alcuni parametri della stringa di query URL:
- ignore_unavailable- Non si verificherà alcun errore o non verrà interrotta nessuna operazione, se uno o più indici presenti nell'URL non esistono. Ad esempio, esiste l'indice delle scuole, ma i book_shops non esistono.
POST /school*,book_shops/_search
Corpo della richiesta
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Corpo della richiesta
{
"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
}
Considera il codice seguente:
POST /school*,book_shops/_search?ignore_unavailable = true
Corpo della richiesta
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Risposta (nessun errore)
Oggetti JSON da tutti gli indici che iniziano con la scuola contenente CBSE.
allow_no_indices
trueil valore di questo parametro eviterà errori, se un URL con caratteri jolly non produce indici. Ad esempio, non esiste un indice che inizi con school_pri -
POST /schools_pri*/_search?allow_no_indices = true
Corpo della richiesta
{
"query":{
"match_all":{}
}
}
Risposta (nessun errore)
{
"took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0},
"hits":{"total":0, "max_score":0.0, "hits":[]}
}
expand_wildcards
Questo parametro decide se i caratteri jolly devono essere espansi per aprire indici o indici chiusi o eseguire entrambi. Il valore di questo parametro può essere aperto e chiuso o nessuno e tutti.
Ad esempio, chiudi le scuole indice -
POST /schools/_close
Risposta
{"acknowledged":true}
Considera il codice seguente:
POST /school*/_search?expand_wildcards = closed
Corpo della richiesta
{
"query":{
"match_all":{}
}
}
Risposta
{
"error":{
"root_cause":[{
"type":"index_closed_exception", "reason":"closed", "index":"schools"
}],
"type":"index_closed_exception", "reason":"closed", "index":"schools"
}, "status":403
}
Supporto per la matematica della data nei nomi degli indici
Elasticsearch offre una funzionalità per cercare indici in base a data e ora. Dobbiamo specificare la data e l'ora in un formato specifico. Ad esempio, accountdetail-2015.12.30, index memorizzerà i dettagli del conto bancario del 30 dicembre 2015. È possibile eseguire operazioni matematiche per ottenere dettagli per una data particolare o un intervallo di data e ora.
Formato per il nome dell'indice matematico della data -
<static_name{date_math_expr{date_format|time_zone}}>
/<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search
static_name è una parte dell'espressione che rimane la stessa in ogni indice matematico della data come i dettagli dell'account. date_math_expr contiene l'espressione matematica che determina la data e l'ora dinamicamente come now-2d. date_format contiene il formato in cui la data viene scritta nell'indice come YYYY.MM.dd. Se la data odierna è il 30 dicembre 2015, <accountdetail- {now-2d {YYYY.MM.dd}}> restituirà accountdetail-2015.12.28.
Espressione | Risolve a |
---|---|
<accountdetail- {now-d}> | accountdetail-2015.12.29 |
<accountdetail- {now-M}> | accountdetail-2015.11.30 |
<accountdetail- {now {YYYY.MM}}> | accountdetail-2015.12 |
Vedremo ora alcune delle opzioni comuni disponibili in Elasticsearch che possono essere utilizzate per ottenere la risposta in un formato specificato.
Piuttosto risultati
Possiamo ottenere una risposta in un oggetto JSON ben formattato semplicemente aggiungendo un parametro di query URL, ad esempio, pretty = true.
POST /schools/_search?pretty = true
Corpo della richiesta
{
"query":{
"match_all":{}
}
}
Risposta
……………………..
{
"_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"
}
}
………………….
Output leggibile dall'uomo
Questa opzione può modificare le risposte statistiche in formato leggibile dall'uomo (se umano = vero) o leggibile dal computer (se umano = falso). Ad esempio, se human = true then distance_kilometer = 20KM e if human = false then distance_meter = 20000, quando la risposta deve essere utilizzata da un altro programma per computer.
Filtro delle risposte
Possiamo filtrare la risposta a meno campi aggiungendoli nel parametro field_path. Per esempio,
POST /schools/_search?filter_path = hits.total
Corpo della richiesta
{
"query":{
"match_all":{}
}
}
Risposta
{"hits":{"total":3}}