Elasticsearch - Konwencje API
Interfejs programowania aplikacji (API) w sieci WWW to grupa wywołań funkcji lub innych instrukcji programistycznych w celu uzyskania dostępu do komponentu oprogramowania w tej konkretnej aplikacji internetowej. Na przykład interfejs API Facebooka pomaga programiście tworzyć aplikacje, uzyskując dostęp do danych lub innych funkcji z Facebooka; może to być data urodzenia lub aktualizacja statusu.
Elasticsearch udostępnia REST API, do którego dostęp uzyskuje się przez JSON przez HTTP. Elasticsearch używa pewnych konwencji, które teraz omówimy.
Wiele indeksów
Większość operacji, głównie wyszukiwania i innych operacji, w interfejsach API dotyczy jednego lub więcej niż jednego indeksu. Pomaga to użytkownikowi wyszukiwać w wielu miejscach lub we wszystkich dostępnych danych, wykonując zapytanie tylko raz. Do wykonywania operacji na wielu indeksach używa się wielu różnych notacji. Omówimy kilka z nich w tym rozdziale.
Notacja oddzielona przecinkami
POST /index1,index2,index3/_search
Treść żądania
{
"query":{
"query_string":{
"query":"any_string"
}
}
}
Odpowiedź
Obiekty JSON z index1, index2, index3 zawierające any_string.
_all Słowo kluczowe dla wszystkich indeksów
POST /_all/_search
Treść żądania
{
"query":{
"query_string":{
"query":"any_string"
}
}
}
Odpowiedź
Obiekty JSON ze wszystkich indeksów i mające w sobie any_string.
Symbole wieloznaczne (*, +, -)
POST /school*/_search
Treść żądania
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Odpowiedź
Obiekty JSON ze wszystkich indeksów, które zaczynają się od szkoły zawierającej CBSE.
Alternatywnie możesz również użyć następującego kodu -
POST /school*,-schools_gov /_search
Treść żądania
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Odpowiedź
Obiekty JSON ze wszystkich indeksów, które zaczynają się od słowa „school”, ale nie pochodzą od słowo „school_gov” i zawierają w sobie CBSE.
Istnieją również parametry ciągu zapytania URL -
- ignore_unavailable- Żaden błąd nie wystąpi lub żadna operacja nie zostanie zatrzymana, jeśli jeden lub więcej indeksów obecnych w adresie URL nie istnieje. Na przykład indeks szkół istnieje, ale księgarnie nie istnieją.
POST /school*,book_shops/_search
Treść żądania
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Treść żądania
{
"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
}
Rozważ następujący kod -
POST /school*,book_shops/_search?ignore_unavailable = true
Treść żądania
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Odpowiedź (brak błędu)
Obiekty JSON ze wszystkich indeksów, które zaczynają się od szkoły zawierającej CBSE.
allow_no_indices
truewartość tego parametru zapobiegnie błędom, jeśli adres URL z symbolem wieloznacznym nie będzie zawierał żadnych indeksów. Na przykład nie ma indeksu zaczynającego się od school_pri -
POST /schools_pri*/_search?allow_no_indices = true
Treść żądania
{
"query":{
"match_all":{}
}
}
Odpowiedź (brak błędów)
{
"took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0},
"hits":{"total":0, "max_score":0.0, "hits":[]}
}
expand_wildcards
Ten parametr decyduje o tym, czy symbole wieloznaczne mają zostać rozszerzone na indeksy otwarte lub indeksy zamknięte, czy też wykonać jedno i drugie. Wartość tego parametru może być otwarta i zamknięta lub żadna i wszystkie.
Na przykład zamknij szkoły indeksowe -
POST /schools/_close
Odpowiedź
{"acknowledged":true}
Rozważ następujący kod -
POST /school*/_search?expand_wildcards = closed
Treść żądania
{
"query":{
"match_all":{}
}
}
Odpowiedź
{
"error":{
"root_cause":[{
"type":"index_closed_exception", "reason":"closed", "index":"schools"
}],
"type":"index_closed_exception", "reason":"closed", "index":"schools"
}, "status":403
}
Obsługa daty w nazwach indeksów
Elasticsearch oferuje funkcję wyszukiwania indeksów według daty i czasu. Musimy podać datę i godzinę w określonym formacie. Na przykład accountdetail-2015.12.30, index przechowuje szczegóły konta bankowego z 30 grudnia 2015 r. Aby uzyskać szczegółowe informacje na temat określonej daty lub zakresu dat i godzin, można wykonać operacje matematyczne.
Format nazwy indeksu matematycznego daty -
<static_name{date_math_expr{date_format|time_zone}}>
/<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search
static_name to część wyrażenia, która pozostaje taka sama w każdym indeksie matematycznym daty, podobnie jak szczegóły konta. date_math_expr zawiera wyrażenie matematyczne, które dynamicznie określa datę i godzinę, tak jak teraz-2d. date_format zawiera format, w jakim data jest zapisywana w indeksie, np. RRRR.MM.dd. Jeśli dzisiejszą datą jest 30 grudnia 2015 r., <Accountdetail- {now-2d {YYYY.MM.dd}}> zwróci accountdetail-2015.12.28.
Wyrażenie | Rozwiązuje się |
---|---|
<accountdetail- {now-d}> | accountdetail-2015.12.29 |
<accountdetail- {now-M}> | accountdetail-2015.11.30 |
<accountdetail- {now {YYYY.MM}}> | accountdetail-2015.12 |
Zobaczymy teraz niektóre typowe opcje dostępne w Elasticsearch, których można użyć do uzyskania odpowiedzi w określonym formacie.
Dość wyniki
Możemy uzyskać odpowiedź w dobrze sformatowanym obiekcie JSON, po prostu dołączając parametr zapytania URL, tj. Pretty = true.
POST /schools/_search?pretty = true
Treść żądania
{
"query":{
"match_all":{}
}
}
Odpowiedź
……………………..
{
"_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"
}
}
………………….
Wyjście czytelne dla człowieka
Ta opcja może zmienić odpowiedzi statystyczne na postać czytelną dla człowieka (jeśli człowiek = prawda) lub formę czytelną dla komputera (jeśli człowiek = fałsz). Na przykład, jeśli human = true to distance_kilometer = 20KM, a jeśli human = false, to distance_meter = 20000, gdy odpowiedź musi być wykorzystana przez inny program komputerowy.
Filtrowanie odpowiedzi
Możemy filtrować odpowiedź na mniej pól, dodając je w parametrze field_path. Na przykład,
POST /schools/_search?filter_path = hits.total
Treść żądania
{
"query":{
"match_all":{}
}
}
Odpowiedź
{"hits":{"total":3}}