Jest - klient Java Elasticsearch

1. Úvod

Každý, kto pracoval s Elasticsearch, vie, že vytváranie dotazov pomocou ich vyhľadávacieho rozhrania RESTful API môže byť únavné a náchylné na chyby.

V tomto výučbe sa pozrieme na Jest, klienta HTTP Java pre Elasticsearch. Zatiaľ čo Elasticsearch poskytuje svojho vlastného natívneho klienta Java, Jest poskytuje plynulejšie rozhranie API a ľahšie sa s ním pracuje.

2. Závislosť od Maven

Prvá vec, ktorú musíme urobiť, je importovať knižnicu Jest do nášho POM:

 io.searchbox jest 6.3.1 

Verzia pre Jest sa riadi verziou hlavného produktu Elasticsearch. To pomáha zabezpečiť kompatibilitu medzi klientom a serverom.

Zahrnutím závislosti Jest bude príslušná knižnica Elasticsearch zahrnutá ako tranzitívna závislosť.

3. Používanie klienta Jest

V tejto časti sa pozrieme na používanie klienta Jest na vykonávanie bežných úloh s Elasticsearch.

Pre použitie klienta Jest jednoducho vytvoríme a JestClient objekt pomocou JestClientFactory. Vytváranie týchto objektov je nákladné a bezpečné voči vláknam, takže vytvoríme jednu inštanciu, ktorú je možné zdieľať v celej našej aplikácii:

public JestClient jestClient () {JestClientFactory factory = nový JestClientFactory (); factory.setHttpClientConfig (nový HttpClientConfig.Builder ("// localhost: 9200") .multiThreaded (true) .defaultMaxTotalConnectionPerRoute (2) .maxTotalConnection (10) .build ()); vrátiť factory.getObject (); }

Takto sa vytvorí klient Jest pripojený k lokálne bežiacemu klientovi Elasticsearch. Aj keď je tento príklad pripojenia triviálny, Jest má tiež plnú podporu serverov proxy, SSL, autentifikácie a dokonca aj objavovania uzlov.

The JestClient trieda je všeobecná a má iba niekoľko verejných metód. Hlavná, ktorú použijeme, je vykonať, ktorá vychádza z inštancie Akcia rozhranie. Klient Jest poskytuje niekoľko tried staviteľov, ktoré pomáhajú vytvárať rôzne akcie, ktoré interagujú s Elasticsearch.

Výsledkom všetkých volaní Jest je inštancia JestResult. Úspešnosť môžeme skontrolovať volaním jeÚspech. Za neúspešné akcie môžeme zavolať getErrorMessage získať viac podrobností:

JestResult jestResult = jestClient.execute (nový Delete.Builder ("1"). Index ("zamestnanci"). Build ()); if (jestResult.isSucceeded ()) {System.out.println ("Úspech!"); } else {System.out.println ("Chyba:" + jestResult.getErrorMessage ()); }

3.1. Správa indexov

Na kontrolu existencie indexu používame Indexy existujú akcia:

Výsledok JestResult = jestClient.execute (nový IndicesExists.Builder ("zamestnanci"). Build ()) 

Na vytvorenie indexu používame CreateIndex akcia:

jestClient.execute (nový CreateIndex.Builder ("zamestnanci"). build ());

Týmto sa vytvorí index s predvoleným nastavením. Počas vytvárania indexu môžeme prepísať konkrétne nastavenia:

Nastavenia mapy = nová HashMap (); settings.put ("number_of_shards", 11); settings.put ("number_of_replicas", 2); jestClient.execute (nový CreateIndex.Builder ("zamestnanci"). nastavenia (nastavenia) .build ());

Vytváranie alebo zmena aliasov je tiež jednoduché pomocou ModifyAliases akcia:

jestClient.execute (nový ModifyAliases.Builder (nový AddAliasMapping.Builder ("zamestnanci", "e"). build ()). build ()); jestClient.execute (nový ModifyAliases.Builder (nový RemoveAliasMapping.Builder ("zamestnanci", "e"). build ()). build ());

3.2. Vytváranie dokumentov

Klient Jest uľahčuje indexovanie - alebo vytváranie - nových dokumentov pomocou Register akčná trieda. Dokumenty v Elasticsearch sú iba údaje JSON, a existuje niekoľko spôsobov, ako preniesť údaje JSON klientovi Jest na indexovanie.

V tomto príklade použijeme imaginárny dokument zamestnanca:

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

Prvý spôsob, ako reprezentovať dokument JSON, je použitie Java String. Aj keď môžeme reťazec JSON vytvoriť manuálne, musíme pamätať na správne formátovanie, zložené zátvorky a unikajúce znaky úvodzoviek.

Preto je jednoduchšie použiť knižnicu JSON, napríklad Jackson, na zostavenie našej štruktúry JSON a následnú konverziu na a String:

ObjectMapper mapovač = nový ObjectMapper (); JsonNode employeeJsonNode = mapper.createObjectNode () .put ("name", "Michael Pratt") .put ("title", "Java Developer") .put ("yearsOfService", 2) .set ("skills", mapovač. createArrayNode () .add ("java") .add ("jar") .add ("elasticsearch")); jestClient.execute (nový Index.Builder (employeeJsonNode.toString ()). index ("zamestnanci"). build ());

Môžeme tiež použiť Java Mapa zastupovať údaje JSON a odovzdávať ich Register akcia:

Mapa employeeHashMap = nový LinkedHashMap (); employeeHashMap.put ("meno", "Michael Pratt"); employeeHashMap.put ("title", "Java Developer"); employeeHashMap.put ("yearsOfService", 2); employeeHashMap.put ("skills", Arrays.asList ("java", "spring", "elasticsearch")); jestClient.execute (nový Index.Builder (employeeHashMap) .index ("zamestnanci"). build ());

Nakoniec môže klient Jest prijať akýkoľvek POJO, ktorý predstavuje dokument, ktorý sa má indexovať. Povedzme, že máme Zamestnanec trieda:

verejná trieda Zamestnanec {Názov reťazca; Názov reťazca; Zoznam schopností; int yearsOfService; }

Instanciu tejto triedy môžeme odovzdať priamo do Register staviteľ:

Zamestnanec zamestnanec = nový zamestnanec (); employee.setName ("Michael Pratt"); employee.setTitle ("Java Developer"); employee.setYearsOfService (2); employee.setSkills (Arrays.asList ("java", "pružina", "elasticsearch")); jestClient.execute (nový Index.Builder (zamestnanec) .index ("zamestnanci"). build ());

3.3. Čítanie dokumentov

Existujú dva primárne spôsoby prístupu k dokumentu z Elasticsearch pomocou klienta Jest. Po prvé, ak poznáme ID dokumentu, môžeme k nemu získať priamy prístup pomocou Získajte akcia:

jestClient.execute (nový Get.Builder ("zamestnanci", "17"). build ());

Pre prístup k vrátenému dokumentu musíme zavolať jeden z rôznych getSource metódy. Výsledok môžeme získať ako surový JSON alebo ho deserializovať späť na DTO:

Zamestnanec getResult = jestClient.execute (nový Get.Builder ("zamestnanci", "1"). Build ()) .getSourceAsObject (Employee.class);

Ďalším spôsobom prístupu k dokumentom je použitie vyhľadávacieho dotazu, ktorý je implementovaný v Jeste pomocou Vyhľadávanie akcia.

Klient Jest podporuje celý dopyt Elasticsearch DSL. Rovnako ako operácie indexovania, aj dotazy sú vyjadrené ako dokumenty JSON a existuje niekoľko spôsobov, ako vykonať vyhľadávanie.

Najskôr môžeme odovzdať reťazec JSON, ktorý predstavuje vyhľadávací dopyt. Pripomíname, že sa musíme postarať o to, aby reťazec správne unikol a bol platný JSON:

Reťazec search = "{" + "\" dopyt \ ": {" + "\" bool \ ": {" + "\" musí \ ": [" + "{\" zápas \ ": {\" meno \ ": \" Michael Pratt \ "}}" + "]" + "}" + "}" + "}"; jestClient.execute (nový Search.Builder (vyhľadávanie) .build ());

Rovnako ako v prípade Register vyššie by sme mohli použiť knižnicu ako Jackson na vytvorenie nášho reťazca dotazu JSON.

Ďalej môžeme tiež použiť natívne Elasticsearch query action API. Nevýhodou je, že naša aplikácia musí závisieť od celej knižnice Elasticsearch.

Vďaka Vyhľadávanie akcie, k zodpovedajúcim dokumentom je možné pristupovať pomocou getSource metódy. Avšak Jest tiež poskytuje Hit triedy, ktorá zabalí zodpovedajúce dokumenty a poskytne metaúdaje o výsledkoch. Pomocou Hit triedy, môžeme získať prístup k ďalším metadátam pre každý výsledok: skóre, smerovanie a vysvetlenie výsledkov, aby sme vymenovali aspoň niektoré:

Zoznam searchResults = jestClient.execute (new Search.Builder (search) .build ()) .getHits (Employee.class); searchResults.forEach (hit -> {System.out.println (String.format ("Dokument% s má skóre% s", hit.id, hit.score));});

3.4. Aktualizácia dokumentov

Jest poskytuje jednoduché Aktualizácia akcia na aktualizáciu dokumentov:

employee.setYearOfService (3); jestClient.execute (nový Update.Builder (zamestnanec) .index ("zamestnanci"). id ("1"). build ());

Prijíma rovnaké vyjadrenia JSON ako Register akciu, ktorú sme videli už skôr, a uľahčujeme zdieľanie kódu medzi týmito dvoma operáciami.

3.5. Mazanie dokumentov

Vymazanie dokumentu z indexu sa vykonáva pomocou Odstrániť akcia. Vyžaduje iba indexový názov a ID dokumentu:

jestClient.execute (nový Delete.Builder ("17") .index ("zamestnanci") .build ());

4. Hromadné operácie

Klient Jest podporuje aj hromadné operácie. To znamená, že môžeme ušetriť čas a šírku pásma odosielaním viacerých operácií naraz.

Pomocou Objem môžeme spojiť ľubovoľný počet požiadaviek do jedného hovoru. Môžeme dokonca kombinovať rôzne typy požiadaviek:

jestClient.execute (nový Bulk.Builder () .defaultIndex ("zamestnanci") .addAction (nový Index.Builder (employeeObject1) .build ()) .addAction (nový Index.Builder (employeeObject2) .build ()) .addAction ( nový Delete.Builder ("17"). build ()) .build ());

5. Asynchrónne operácie

Klient Jest podporuje aj asynchrónne operácie, čo znamená, že môžeme vykonať ktorúkoľvek z vyššie uvedených operácií pomocou neblokujúcich I / O.

Ak chcete vyvolať operáciu asynchrónne, jednoducho použite executeAsync metóda klienta:

jestClient.executeAsync (nový Index.Builder (employeeObject1) .build (), nový JestResultHandler () {@Override public void dokončený (výsledok JestResult) {// handle result} @Override public void failed (Výnimka výnimkou) {// výnimka handle }});

Upozorňujeme, že okrem akcie (v tomto prípade indexovania), asynchrónny tok vyžaduje aj a JestResultHandler. Po dokončení akcie klient Jest zavolá tento objekt. Rozhranie má dve metódy - dokončené a zlyhalo - ktoré umožňujú zvládnuť buď úspech, alebo neúspech operácie.

6. Záver

V tomto tutoriáli sme sa stručne pozreli na klienta Jest, klienta RESTful Java pre Elasticsearch.

Aj keď sme pokryli iba malú časť jeho funkčnosti, je zrejmé, že Jest je robustný klient Elasticsearch. Jeho plynulé triedy staviteľov a rozhrania RESTful uľahčujú učenie sa a jeho plná podpora rozhraní Elasticsearch z neho robí schopnú alternatívu k natívnemu klientovi.

Všetky príklady kódov v tomto výučbe sú ako vždy na GitHube.


$config[zx-auto] not found$config[zx-overlay] not found