Elasticsearch-a (ES) – Vol.1

Miloš Joković
milos_jokovic
February 21, 2017

Uvod u instalaciju i konfiguraciju Elasticsearch-a (ES) – Vol.1

Upoznajte se sa Elasticsearch (ES) open source serverom, jednim od najpopularnijih pretraživača kojeg karakterišu izuzetne performanse, pretraživanje u skoro realnom vremenu i jednostavna instalacija i konfiguracija. Nema vremena za gubljenje – otkrivanje razloga zbog kojih ovaj pretraživač, između ostalih, koriste LinkedIn, Wikipedia, Target, eBay i WordPress počinje sad!

Šta je Elasticsearch (ES)?

Elasticsearch (ES) je open source server koji je baziran na Lucene-u, razvijen u Java programskom jeziku i objavljen kao open source projekat pod uslovima Apache licence. Elasticsearch pruža distribuiran, full-text search engine sa HTTP web interfejsom koji je optimizovan za tekstualnu pretragu. ES server posjeduje RESTfull API, pri čemu se sa ES serverom komunicira preko JSON formata.

Karakteriše ga laka konfiguracija i veliki broj opcija za definisanje pretrage, a optimizovana tekstualna pretraga podrazumijeva pretragu specifičnih podataka, pretragu početnih slova ključne riječi i indeksiranje.

ES je jedan od najpopularnijih pretraživača kojeg koriste i giganti kao što su: LinkedInWikipediaTarget, ebayWordPress i drugi.

Zašto biste koristili Elasticsearch (ES)?

Elasticsearch (ES) server se može koristiti za pretraživanje svih vrsta dokumenata i pruža skalabilno pretraživanje. ES je “Near Real Time” (NRT) pretraživač – omogućava pretraživanje u skoro realnom vremenu, jer je od unosa podataka do mogućnosti pretraživanja dovoljna samo 1 sekunda. To je vrijeme koje je potrebno da se podaci indeksiraju kroz distribuiranu arhiterkturu ES-a. ES se distribuira, što znači da se indeksi mogu podijeliti u više odvojenih fajlova (eng. shards). Svaki indeks može imati jednu ili više replika, a svaki čvor (eng. node) je domaćin jednog ili više fajlova koji sadrži podatke.

Sa ES komuniciramo pomoću ES JSON RESTFullAPI-ja.

Razlozi koji idu u prilog korišćenju Elasticsearch-a su sljedeći:

  • odlične performanse u pretraživanju
  • skalabilnost
  • denormalizovano čuvanje podataka
  • zamjena za MongoDB ili RavenDB

Nije rijetkost da se u razvoju aplikacija dešava situacija da iz više tabela treba da pročitamo i spojimo podatke kako bismo dobili željenu informaciju. Tada SQL upit izgleda ovako: 

select   t1.ime

, t2.cijena

, t3.adresa

, t4.opis

from table1 as t1

         inner join table2 as t2 on t1.ID = t2.ID

         inner join table3 as t3 on t2.ID = t3.ID

         inner join table4 as t4 on t3.ID = t4.ID

Izvršavanje upita može trajati duže u zavisnosti od veličina tabela koje učestvuju u upitu, što negativno utiče na performanse. Konvertovanjem rezultata u JSON format, kreiramo dokumenta koja možemo da indeksiramo sa ES.

Primjer rezultata u JSON formatu:

{

    ‘ime’:  ‘…’

  , ‘cijena’:  ‘…’

  , ‘adresa’:  ‘…’

  , ‘opis’:  ‘…’    

}

ES ima odlične preformanse, jer on radi pretraživanje nad dokumentima u sklopu kojih već imamo sve potrebne podatke i nije potrebno izvršavati svaki put SQL upit kada pokrenemo pretragu. Na ovaj način izbjegavamo čekanje da se SQL upit izvrši, čime ES dobija na performansama.

Kako teče proces instalacije i konfiguracije Elasticsearch-a (ES)?

ES server se može preuzeti sa zvaničnog sajta Elastic-a, a da bi startovali ES server dovoljno je otpakovati preuzeti fajl i iz novokreiranog foldera pokrenuti naredbu ili bat fajl kroz terminal (bat fajl ukoliko radite na Windows OS: bin\elasticsearch.bat, naredba ukoliko radite na nekom drugom OS: bin\elasticsearch).

Ukoliko je sve prošlo uspješno, trebalo bi da dobijete sledeći izlaz u vašem terminalu:

ES server zaustavljamo naredbom: Ctrl+C.

Napomena

Za rad ES potrebno je da imamo instaliran Java plugin, koji je moguće preuzeti sa zvaničnog Java sajta, i podešenu JAVA_HOME varijablu.

Vodite računa da preuzmete odgovarajuću verziju x86 ili x64 plugin-a prema verziji OS koju koristite.

Sada, kada smo pokrenuli ES server, možemo i da komuniciramo preko JSON (JavaScript Object Notation)  RestAPI-ja koji se nalazi na localhostu na portu 9200.

Kako funkcioniše pretraživanje teksta?

ES pamti svaku riječ iz teksta kao pojam, a za svaki pojam pamti dokument u kom se pojam pojavljuje, kao i njegovu poziciju u dokumentu. Takođe, pamti i ukupan broj ponavljanja pojma u svim dokumentima.

Za pretragu dokumenata koristimo filtere (eng. filter)  i upite (eng. queries).

Pretragu možemo realizovati na nekoliko načina:

  • Query string:

Kroz URL šaljemo parametar “q” za pretragu i u URL navodimo indeks i tip dokumenta koji pretražujemo. Ovaj način je dobar za jednostavne upite, ali se ne  preporučuje za složenije upite.

Primjer zahtjeva: http://localhost:9200/ecommerce/product/_search?q=pasta

Primjer zahtjeva ako želimo da pretražujemo po polju name:

http://localhost:9200/ecommerce/product/_search?q=name:pasta

  • Query DSL:

Parametre za pretragu proslijeđujemo kroz “body request” u JSON formatu koji je pregledniji i fleksibilniji.

Primjer zahtjeva: http://localhost:9200/ecommerce/product/_search

{

    “query”:{

          “match”: {

                        “name”: “pasta”

            }

    }   

}

Kod pretraživanja je obavezno navesti parametar _search. Oblasti pretraživanja u zavisnosti od toga šta je navedeno u pozivu:

Za više informacija pogledajte zvaničnu dokumentaciju.

Konfiguracija ES

Konfiguracioni fajl se nalazi u config folderu i ima ekstenziju .yml. U našem slučaju naziv fajla je elasticsearch.yml.

Kroz konfiguracioni fajl možemo da podesimo više stvari, a neke od njih su:

  • cluster.name = testaplication (npr. ako želimo da promijenimo podrazumijevanu vrijednost elasticsearch)
  • node.master: true
  • node.data: true

Na primjer, kombinacijom parametara node.master i node.data možemo da podesimo da je čvor:

  • master i da čuva indeksirane podatke
  • da nije master, već da čuva samo podatke
  • da je master i da ne čuva podatke, već da ima ulogu koordinatora.

Iako imamo jedan čvor, ES server će provjeravati da li ima još neki u grupi (eng. cluster) i trošiti resurse. Ovo možemo izbjeći konfiguracijom parametara:

discovery.zen.ping.multicast.enabled: false

Čvorove iz grupetakođe, možemo navoditi pomoću parametra:

discovery.zen.ping.unicast.host:[“host1”,”host2”]

Pozivom: GET http://localhost:9200/_cluster/health provjeravamo status grupe (eng. cluster).

Ovo je bio samo kratak  uvod u Elasticsearch i mogućnosti koje on pruža. “Ponavljanje je majka znanja“ u svakom, pa i u ovom slučaju, a naročito kada dođe na red praktična primjena stečenih teorijskih znanja. Za bolji rad u ovom open source serveru, potrebno je upoznati se sa specifičnom terminologijom koja se koristi u ES, a nakon toga bićete spremni da samostalno kreirate pozive. Pročitajte više.

Šalji
dalje

Ostali kul postovi

Ukazali su nam svoje povjerenje

Postani jedan od njih