Jest - Elasticsearch Java klijent

1. Uvod

Svatko tko je surađivao s Elasticsearchom zna da izrada upita pomoću njihovog RESTful API-ja za pretraživanje može biti dosadna i sklona pogreškama.

U ovom uputstvu pogledat ćemo Jest, HTTP Java klijent za Elasticsearch. Iako Elasticsearch nudi vlastiti izvorni Java klijent, Jest pruža tečniji API i lakša sučelja za rad.

2. Ovisnost Mavena

Prvo što moramo učiniti je uvesti Jest knjižnicu u naš POM:

 io.searchbox jest 6.3.1 

Izrada verzija za Jest slijedi verziju glavnog proizvoda Elasticsearch. To pomaže u osiguravanju kompatibilnosti između klijenta i poslužitelja.

Uključivanjem ovisnosti Jest, odgovarajuća biblioteka Elasticsearch bit će uključena kao prijelazna ovisnost.

3. Korištenje Jest klijenta

U ovom ćemo odjeljku pogledati upotrebu klijenta Jest za obavljanje uobičajenih zadataka s Elasticsearchom.

Da bismo koristili klijenta Jest, mi jednostavno kreiramo JestClient objekt pomoću JestClientFactory. Te je predmete skupo stvoriti i oni su sigurni za konac, pa ćemo stvoriti pojedinačnu instancu koja se može dijeliti kroz našu aplikaciju:

javni JestClient jestClient () {tvornica JestClientFactory = nova JestClientFactory (); factory.setHttpClientConfig (novi HttpClientConfig.Builder ("// localhost: 9200") .multiThreaded (true) .defaultMaxTotalConnectionPerRoute (2) .maxTotalConnection (10) .build ()); povratak factory.getObject (); }

To će stvoriti Jest klijenta povezanog s Elasticsearch klijentom koji se izvodi lokalno. Iako je ovaj primjer veze trivijalan, Jest također ima punu podršku za proxyje, SSL, provjeru autentičnosti, pa čak i otkrivanje čvorova.

The JestClient razred je generički i ima samo nekoliko javnih metoda. Glavna koju ćemo koristiti je izvršiti, koji uzima primjerak Akcijski sučelje. Klijent Jest nudi nekoliko klasa graditelja koji pomažu u stvaranju različitih radnji koje komuniciraju s Elasticsearchom.

Rezultat svih Jestovih poziva je primjer JestResult. Uspjeh možemo provjeriti pozivom jeUspjelo. Za neuspješne akcije možemo nazvati getErrorMessage da biste dobili više detalja:

JestResult jestResult = jestClient.execute (novi Delete.Builder ("1"). Index ("zaposlenici"). Build ()); if (jestResult.isSucceeded ()) {System.out.println ("Uspjeh!"); } else {System.out.println ("Pogreška:" + jestResult.getErrorMessage ()); }

3.1. Upravljanje indeksima

Da bismo provjerili postoji li indeks, koristimo IndeksiPostoji akcijski:

Rezultat JestResult = jestClient.execute (novi IndicesExists.Builder ("zaposlenici"). Build ()) 

Da bismo stvorili indeks, koristimo CreateIndex akcijski:

jestClient.execute (novi CreateIndex.Builder ("zaposlenici"). build ());

To će stvoriti indeks sa zadanim postavkama. Tijekom izrade indeksa možemo nadjačati određene postavke:

Postavke karte = novi HashMap (); settings.put ("number_of_shards", 11); settings.put ("broj_replika", 2); jestClient.execute (novi CreateIndex.Builder ("zaposlenici"). postavke (postavke) .build ());

A stvaranje ili promjena pseudonima također je jednostavno pomoću ModifyAliases akcijski:

jestClient.execute (novi ModifyAliases.Builder (novi AddAliasMapping.Builder ("zaposlenici", "e"). build ()). build ()); jestClient.execute (novi ModifyAliases.Builder (novi RemoveAliasMapping.Builder ("zaposlenici", "e"). build ()). build ());

3.2. Izrada dokumenata

Klijent Jest olakšava indeksiranje - ili stvaranje - novih dokumenata pomoću Indeks razred akcije. Dokumenti u Elasticsearchu samo su JSON podaci, a postoji više načina za prosljeđivanje JSON podataka klijentu Jest za indeksiranje.

Za ovaj primjer upotrijebimo zamišljeni dokument zaposlenika:

{"name": "Michael Pratt", "title": "Java Developer", "skills": ["java", "spring", "elasticsearch"], "yearsOfService": 2}

Prvi način predstavljanja JSON dokumenta je pomoću Jave Niz. Iako možemo ručno stvoriti JSON niz, moramo voditi računa o pravilnom oblikovanju, zagradama i izbjegavanju navodnika.

Stoga je lakše koristiti JSON knjižnicu kao što je Jackson za izgradnju naše JSON strukture i zatim pretvaranje u Niz:

Mapa ObjectMapper = novi ObjectMapper (); JsonNode zaposlenikJsonNode = mapper.createObjectNode () .put ("name", "Michael Pratt") .put ("title", "Java Developer") .put ("yearsOfService", 2) .set ("skills", mapper. createArrayNode () .add ("java") .add ("spring") .add ("elasticsearch")); jestClient.execute (novi Index.Builder (workerJsonNode.toString ()). index ("zaposlenici"). build ());

Možemo koristiti i Javu Karta za predstavljanje JSON podataka i njihovo prosljeđivanje Indeks akcijski:

Karta zaposlenHashMap = novi LinkedHashMap (); workerHashMap.put ("ime", "Michael Pratt"); workerHashMap.put ("naslov", "Razvijač Java"); workerHashMap.put ("yearsOfService", 2); workerHashMap.put ("skills", Arrays.asList ("java", "spring", "elasticsearch")); jestClient.execute (novi Index.Builder (workerHashMap) .index ("zaposlenici"). build ());

Konačno, klijent Jest može prihvatiti bilo koji POJO koji predstavlja dokument za indeksiranje. Recimo da imamo Zaposlenik razred:

javni razred Zaposlenik {Ime niza; Naslov niza; Popis vještina; int yearsOfService; }

Primjer ove klase možemo proslijediti izravno na Indeks graditelj:

Zaposlenik zaposlenik = novi zaposlenik (); worker.setName ("Michael Pratt"); zaposlenik.setTitle ("Java Developer"); worker.setYearsOfService (2); worker.setSkills (Arrays.asList ("java", "spring", "elasticsearch")); jestClient.execute (novi Index.Builder (zaposlenik) .index ("zaposlenici"). build ());

3.3. Čitanje dokumenata

Postoje dva osnovna načina pristupa dokumentu iz Elasticsearch-a pomoću Jest klijenta. Prvo, ako znamo ID dokumenta, možemo mu pristupiti izravno pomoću Dobiti akcijski:

jestClient.execute (novi Get.Builder ("zaposlenici", "17"). build ());

Da bismo pristupili vraćenom dokumentu, moramo nazvati jednog od različitih getSource metode. Rezultat možemo dobiti kao sirovi JSON ili ga deserijalizirati natrag u DTO:

Zaposlenik getResult = jestClient.execute (novi Get.Builder ("zaposlenici", "1"). Build ()) .getSourceAsObject (Employee.class);

Drugi način pristupa dokumentima je pomoću upita za pretraživanje, koji je implementiran u Jest s traži akcijski.

Klijent Jest podržava potpuni Elasticsearch upit DSL. Baš poput operacija indeksiranja, upiti se izražavaju kao JSON dokumenti i postoji više načina za obavljanje pretraživanja.

Prvo, možemo proslijediti JSON niz koji predstavlja upit za pretraživanje. Podsjećanja radi, moramo se pobrinuti da se osigura ispravno izbjegavanje niza i da li vrijedi JSON:

String search = "{" + "\" query \ ": {" + "\" bool \ ": {" + "\" must \ ": [" + "{\" match \ ": {\" name \ ": \" Michael Pratt \ "}}" + "]" + "}" + "}" + "}"; jestClient.execute (novi Search.Builder (search) .build ());

Kao i kod Indeks gore navedeno, mogli bismo koristiti biblioteku kao što je Jackson za izgradnju našeg JSON niza upita.

Uz to, možemo koristiti i izvorni API za radnju upita Elasticsearch. Mana ovog je što naša aplikacija mora ovisiti o punoj biblioteci Elasticsearch.

Uz traži akcije, odgovarajućim dokumentima može se pristupiti pomoću getSource metode. Međutim, Jest također pruža Pogoditi klase, koja omotava odgovarajuće dokumente i pruža metapodatke o rezultatima. Koristiti Pogoditi klase, možemo pristupiti dodatnim metapodacima za svaki rezultat: rezultat, usmjeravanje i objasniti rezultate, da nabrojimo nekoliko:

Popis searchResults = jestClient.execute (novi Search.Builder (search) .build ()) .getHits (Employee.class); searchResults.forEach (hit -> {System.out.println (String.format ("Dokument% s ima ocjenu% s", hit.id, hit.score));});

3.4. Ažuriranje dokumenata

Jest pruža jednostavan ažuriranje akcija za ažuriranje dokumenata:

zaposlenik.setYearOfService (3); jestClient.execute (novi Update.Builder (zaposlenik) .index ("zaposlenici"). id ("1"). build ());

Prihvaća iste JSON reprezentacije kao i Indeks radnju koju smo vidjeli ranije, olakšavajući dijeljenje koda između dvije operacije.

3.5. Brisanje dokumenata

Brisanje dokumenta iz indeksa vrši se pomoću Izbrisati akcijski. Potreban je samo naziv indeksa i ID dokumenta:

jestClient.execute (novi Delete.Builder ("17") .index ("zaposlenici") .build ());

4. Skupne operacije

Klijent Jest također podržava skupne operacije. To znači da možemo uštedjeti vrijeme i širinu pojasa slanjem više operacija istovremeno.

Koristiti Skupno akcije, možemo kombinirati bilo koji broj zahtjeva u jedan poziv. Možemo čak kombinirati različite vrste zahtjeva zajedno:

jestClient.execute (new Bulk.Builder () .defaultIndex ("zaposlenici") .addAction (novi Index.Builder (workerObject1) .build ()) .addAction (novi Index.Builder (workerObject2) .build ()) .addAction ( novi Delete.Builder ("17"). build ()) .build ());

5. Asinkrone operacije

Klijent Jest također podržava asinkrone operacije, što znači da možemo izvršiti bilo koju od gore navedenih operacija koristeći neblokirajući I / O.

Da biste asinkrono pozvali operaciju, jednostavno upotrijebite executeAsync metoda klijenta:

jestClient.executeAsync (novi Index.Builder (workerObject1) .build (), novi JestResultHandler () {@Override javna praznina dovršena (rezultat JestResult) {// handle result} @Override public void failed (Exception ex) {// handle exception }});

Imajte na umu da osim akcije (indeksiranje u ovom slučaju), asinkroni tok zahtijeva i JestResultHandler. Klijent Jest pozvat će ovaj objekt kad akcija završi. Sučelje ima dvije metode - dovršen i neuspjeh - koji omogućuju rukovanje ili uspjehom ili neuspjehom operacije.

6. Zaključak

U ovom uputstvu kratko smo pogledali klijenta Jest, RESTful Java klijenta za Elasticsearch.

Iako smo pokrili samo mali dio njegove funkcionalnosti, jasno je da je Jest robustan klijent Elasticsearch-a. Tekuće klase graditelja i RESTful sučelja olakšavaju učenje, a puna podrška za Elasticsearch sučelja čini ga sposobnom alternativom matičnom klijentu.

Kao i uvijek, svi primjeri koda u vodiču završeni su na GitHubu.