Elasticsearch - API Konvansiyonları

Web'deki Uygulama Programlama Arayüzü (API), söz konusu web uygulamasındaki yazılım bileşenine erişmek için bir grup işlev çağrısı veya diğer programlama talimatlarından oluşur. Örneğin, Facebook API, bir geliştiricinin Facebook'tan verilere veya diğer işlevlere erişerek uygulamalar oluşturmasına yardımcı olur; doğum tarihi veya durum güncellemesi olabilir.

Elasticsearch, JSON tarafından HTTP üzerinden erişilen bir REST API sağlar. Elasticsearch, şimdi tartışacağımız bazı kuralları kullanır.

Çoklu Endeksler

API'lerdeki işlemlerin çoğu, özellikle arama ve diğer işlemler, bir veya birden fazla endeks içindir. Bu, kullanıcının yalnızca bir sorgu çalıştırarak birden çok yerde veya tüm mevcut verileri aramasına yardımcı olur. Birden çok dizinde işlem yapmak için birçok farklı gösterim kullanılır. Bu bölümde birkaçını burada tartışacağız.

Virgülle Ayrılmış Gösterim

POST /index1,index2,index3/_search

Gövde İste

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

Tepki

İçinde any_string bulunan dizin1, dizin2, dizin3'teki JSON nesneleri.

_all Tüm Endeksler için Anahtar Kelime

POST /_all/_search

Gövde İste

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

Tepki

Tüm dizinlerden ve içinde any_string bulunan JSON nesneleri.

Joker karakterler (*, +, -)

POST /school*/_search

Gövde İste

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

Tepki

İçinde CBSE bulunan okulla başlayan tüm dizinlerden JSON nesneleri.

Alternatif olarak, aşağıdaki kodu da kullanabilirsiniz -

POST /school*,-schools_gov /_search

Gövde İste

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

Tepki

JSON, "okul" ile başlayan ancak school_gov'dan olmayan ve içinde CBSE bulunan tüm endekslerden nesneler.

Ayrıca bazı URL sorgu dizesi parametreleri de vardır -

  • ignore_unavailable- URL'de bulunan bir veya daha fazla dizin yoksa, hiçbir hata oluşmaz veya işlem durdurulmaz. Örneğin, okullar dizini vardır, ancak kitap_dizileri mevcut değildir.

POST /school*,book_shops/_search

Gövde İste

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

Gövde İste

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

Aşağıdaki kodu düşünün -

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

Gövde İste

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

Yanıt (hata yok)

İçinde CBSE bulunan okulla başlayan tüm dizinlerden JSON nesneleri.

allow_no_indices

trueBu parametrenin değeri, joker karakter içeren bir URL hiçbir dizin oluşturmazsa hatayı önler. Örneğin, school_pri ile başlayan bir dizin yoktur -

POST /schools_pri*/_search?allow_no_indices = true

Gövde İste

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

Yanıt (Hata yok)

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

expand_wildcards

Bu parametre, joker karakterlerin indisleri veya kapalı indisleri açmak veya her ikisini birden gerçekleştirmek için genişletilmesi gerekip gerekmediğine karar verir. Bu parametrenin değeri açık ve kapalı olabilir veya hiçbiri ve tümü olabilir.

Örneğin, dizin okullarını kapatın -

POST /schools/_close

Tepki

{"acknowledged":true}

Aşağıdaki kodu düşünün -

POST /school*/_search?expand_wildcards = closed

Gövde İste

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

Tepki

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

Dizin Adlarında Tarih Matematik Desteği

Elasticsearch, endeksleri tarih ve saate göre aramak için bir işlev sunar. Tarih ve saati belirli bir formatta belirtmemiz gerekiyor. Örneğin, accountdetail-2015.12.30 endeksi, 30 Aralık 2015 tarihli banka hesabı ayrıntılarını saklayacaktır. Belirli bir tarih veya bir tarih ve saat aralığı için ayrıntıları almak için matematiksel işlemler gerçekleştirilebilir.

Tarih matematik dizin adı biçimi -

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

statik_adı, hesap detayı gibi her tarih matematik indeksinde aynı kalan ifadenin bir parçasıdır. date_math_expr, now-2d gibi tarih ve saati dinamik olarak belirleyen matematiksel ifadeyi içerir. date_format, YYYY.MM.dd gibi dizine tarihin yazıldığı biçimi içerir. Bugünün tarihi 30 Aralık 2015 ise, <accountdetail- {now-2d {YYYY.MM.dd}}>, accountdetail-2015.12.28'i döndürecektir.

İfade Çözülür
<accountdetail- {şimdi-d}> accountdetail-2015.12.29
<accountdetail- {şimdi-M}> accountdetail-2015.11.30
<accountdetail- {şimdi {YYYY.MM}}> accountdetail-2015.12

Şimdi Elasticsearch'te belirli bir formatta yanıtı almak için kullanılabilen bazı yaygın seçenekleri göreceğiz.

Hoş Sonuçlar

İyi biçimlendirilmiş bir JSON nesnesinde sadece bir URL sorgu parametresi ekleyerek, yani pretty = true şeklinde yanıt alabiliriz.

POST /schools/_search?pretty = true

Gövde İste

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

Tepki

……………………..
{
   "_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"
   }
}
………………….

İnsan Okuyabilir Çıktı

Bu seçenek, istatistiksel yanıtları insan tarafından okunabilir forma (insan = doğruysa) veya bilgisayar tarafından okunabilir forma (insan = yanlışsa) değiştirebilir. Örneğin, eğer insan = doğru ise distance_kilometer = 20KM ve eğer insan = false ise o zaman distance_meter = 20000, yanıtın başka bir bilgisayar programı tarafından kullanılması gerektiğinde.

Yanıt Filtreleme

Yanıtı, field_path parametresine ekleyerek daha az alana filtreleyebiliriz. Örneğin,

POST /schools/_search?filter_path = hits.total

Gövde İste

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

Tepki

{"hits":{"total":3}}