Jest - Elasticsearch Java kliens

1. Bemutatkozás

Aki már dolgozott az Elasticsearch-szel, tudja, hogy a RESTful keresési API-jukat használó lekérdezések készítése unalmas és hibára hajlamos lehet.

Ebben az oktatóanyagban megnézzük a Jest HTTP HTTP klienst az Elasticsearch számára. Míg az Elasticsearch biztosítja saját natív Java kliensét, A Jest folyékonyabb API-t és könnyebben kezelhető felületeket biztosít.

2. Maven-függőség

Az első dolog, amit meg kell tennünk, a Jest könyvtár importálása a POM-ba:

 io.searchbox jest 6.3.1 

A Jest verziószáma követi az Elasticsearch fő termékét. Ez segít biztosítani az ügyfél és a szerver kompatibilitását.

A Jest-függőség beszámításával a megfelelő Elasticsearch könyvtár tranzitív függőségként szerepel.

3. A Jest Client használata

Ebben a szakaszban megvizsgáljuk a Jest kliens használatát az Elasticsearch-lel közös feladatok elvégzéséhez.

A Jest kliens használatához egyszerűen létrehozunk egy JestClient objektum a JestClientFactory. Ezeket az objektumokat drága létrehozni, és szálbiztosak, így létrehozunk egy egyedi példányt, amely az alkalmazásunk egészén megosztható:

public JestClient jestClient () {JestClientFactory gyár = new JestClientFactory (); factory.setHttpClientConfig (új HttpClientConfig.Builder ("// localhost: 9200") .multiThreaded (true) .defaultMaxTotalConnectionPerRoute (2) .maxTotalConnection (10) .build ()); return factory.getObject (); }

Ez létrehoz egy Jest klienst egy helyileg futó Elasticsearch klienshez csatlakozva. Bár ez a kapcsolati példa triviális, A Jest teljes mértékben támogatja a proxykat, az SSL-t, a hitelesítést és még a csomópontok felderítését is.

A JestClient osztály általános és csak néhány nyilvános módszerrel rendelkezik. A fő, amit használni fogunk végrehajtani, amely példát vesz a Akció felület. A Jest kliens számos építőosztályt kínál, amelyek elősegítik az Elasticsearch-lel kölcsönhatásban lévő különböző műveletek létrehozását.

Az összes Jest hívás eredménye a JestResult. Hívással ellenőrizhetjük a sikert isSikerült. Sikertelen cselekvések esetén hívhatunk getErrorMessage további részletekért:

JestResult jestResult = jestClient.execute (új Delete.Builder ("1"). Index ("alkalmazottak"). Build ()); if (jestResult.isSucceeded ()) {System.out.println ("Siker!"); } else {System.out.println ("Hiba:" + jestResult.getErrorMessage ()); }

3.1. Kezelő indexek

Annak ellenőrzésére, hogy létezik-e index, a IndexekLéteznek akció:

JestResult eredmény = jestClient.execute (új IndicesExists.Builder ("alkalmazottak"). Build ()) 

Index létrehozásához a CreateIndex akció:

jestClient.execute (új CreateIndex.Builder ("alkalmazottak"). build ());

Ez létrehoz egy indexet az alapértelmezett beállításokkal. Az index létrehozása során felülírhatjuk a meghatározott beállításokat:

Térképbeállítások = new HashMap (); settings.put ("_szeletek_száma ", 11); settings.put ("Replikák_száma", 2); jestClient.execute (új CreateIndex.Builder ("alkalmazottak"). beállítások (beállítások) .build ());

Az álnevek létrehozása vagy módosítása szintén egyszerű a ModifyAliases akció:

jestClient.execute (új ModifyAliases.Builder (új AddAliasMapping.Builder ("alkalmazottak", "e"). build ()). build ()); jestClient.execute (új ModifyAliases.Builder (új RemoveAliasMapping.Builder ("alkalmazottak", "e"). build ()). build ());

3.2. Dokumentumok készítése

A Jest kliens megkönnyíti az új dokumentumok indexelését vagy létrehozását a Index akcióosztály. Az Elasticsearch dokumentumai csak JSON-adatok, és többféleképpen lehet JSON-adatokat továbbítani a Jest kliens számára indexelés céljából.

Ehhez a példához használjunk egy képzeletbeli Employee dokumentumot:

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

A JSON-dokumentum első megjelenítési módja a Java használata Húr. Noha manuálisan létrehozhatjuk a JSON karakterláncot, figyelnünk kell a megfelelő formázásra, zárójelekre és az idézőjelek elkerülésére.

Ezért könnyebb egy JSON könyvtárat használni, mint például a Jackson, hogy felépítsük JSON struktúránkat, majd átalakítsuk a-ba Húr:

ObjectMapper mapper = új ObjectMapper (); JsonNode alkalmazottJsonNode = mapper.createObjectNode () .put ("név", "Michael Pratt") .put ("title", "Java Developer") .put ("yearsOfService", 2) .set ("készségek", mapper. createArrayNode () .add ("java") .add ("spring") .add ("elasticsearch")); jestClient.execute (új Index.Builder (workerJsonNode.toString ()). index ("alkalmazottak"). build ());

Használhatunk Java-t is Térkép ábrázolni a JSON-adatokat és továbbítani azokat a Index akció:

Térkép alkalmazottHashMap = új LinkedHashMap (); workerHashMap.put ("név", "Michael Pratt"); workerHashMap.put ("title", "Java Developer"); workerHashMap.put ("yearsOfService", 2); workerHashMap.put ("készségek", Arrays.asList ("java", "spring", "elasticsearch"); jestClient.execute (új Index.Builder (workerHashMap) .index ("alkalmazottak"). build ());

Végül a Jest kliens minden POJO-t elfogadhat, amely indexeli a dokumentumot. Tegyük fel, hogy van egy Munkavállaló osztály:

public class Alkalmazott {String név; Karakterlánc címe; Sorolja fel a készségeket; int yearsOfService; }

Átadhatunk egy ilyen osztályú példányt közvetlenül a Index építész:

Alkalmazott alkalmazott = új alkalmazott (); worker.setName ("Michael Pratt"); worker.setTitle ("Java Developer"); alkalmazott.setYearsOfService (2); worker.setSkills (Arrays.asList ("java", "spring", "elasticsearch")); jestClient.execute (új Index.Builder (alkalmazott) .index ("alkalmazottak"). build ());

3.3. Dokumentumok olvasása

Kétféle módon lehet hozzáférni egy dokumentumhoz az Elasticsearch alkalmazásból a Jest kliens használatával. Először is, ha ismerjük a dokumentum azonosítóját, akkor közvetlenül elérhetjük a Kap akció:

jestClient.execute (új Get.Builder ("alkalmazottak", "17"). build ());

A visszaküldött dokumentum eléréséhez meg kell hívnunk a többiek egyikét getSource mód. Vagy nyerhetjük az eredményt nyers JSON-ként, vagy deszerializálhatjuk DTO-val:

Employee getResult = jestClient.execute (új Get.Builder ("alkalmazottak", "1"). Build ()) .getSourceAsObject (Employee.class);

A dokumentumok elérésének másik módja egy keresési lekérdezés, amelyet a Jest a Keresés akció.

A Jest kliens támogatja a teljes Elasticsearch lekérdezés DSL-t. Az indexelési műveletekhez hasonlóan a lekérdezéseket JSON-dokumentumokként fejezik ki, és a kereséseknek többféle módja van.

Először átadhatunk egy JSON karakterláncot, amely a keresési lekérdezést képviseli. Emlékeztetőül: vigyáznunk kell arra, hogy a karakterlánc megfelelően el lett-e zárva és érvényes JSON:

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

Mint a Index A fenti művelethez olyan könyvtárat használhatunk, mint például Jackson a JSON lekérdezési karakterláncunk felépítéséhez.

Emellett használhatjuk a natív Elasticsearch lekérdezési művelet API-t is. Ennek egyetlen hátránya, hogy alkalmazásunknak a teljes Elasticsearch könyvtártól kell függenie.

A ... val Keresés műveletet, a megfelelő dokumentumok a getSource mód. Azonban, Jest biztosítja a Találat osztály, amely beburkolja az egyező dokumentumokat, és metaadatokat szolgáltat az eredményekről. Használni a Találat osztályban további metaadatokhoz férhetünk hozzá az egyes eredményekhez: pontszám, útválasztás és az eredmények magyarázata, hogy csak néhányat említsünk:

Lista searchResults = jestClient.execute (új Search.Builder (keresés) .build ()) .getHits (Employee.class); searchResults.forEach (hit -> {System.out.println (String.format ("A% s dokumentumnak% s pontszáma van", hit.id, hit.score));});

3.4. Dokumentumok frissítése

Jest egyszerű Frissítés művelet a dokumentumok frissítéséhez:

alkalmazott.setYearOfService (3); jestClient.execute (új Update.Builder (alkalmazott) .index ("alkalmazottak"). id ("1"). build ());

Ugyanazokat a JSON reprezentációkat fogadja el, mint a Index korábban látott művelet, amely megkönnyítette a kód megosztását a két művelet között.

3.5. Dokumentumok törlése

A dokumentum törlése az indexből a Töröl akció. Csak index nevet és dokumentumazonosítót igényel:

jestClient.execute (új Delete.Builder ("17") .index ("alkalmazottak") .build ());

4. Tömeges műveletek

A Jest kliens a tömeges műveleteket is támogatja. Ez azt jelenti, hogy időt és sávszélességet takaríthatunk meg, ha egyszerre több műveletet küldünk együtt.

Használni a Tömeges műveletet, tetszőleges számú kérést egyesíthetünk egyetlen hívásba. Akár kombinálhatjuk a különféle típusú kéréseket:

jestClient.execute (új Bulk.Builder () .defaultIndex ("alkalmazottak") .addAction (új Index.Builder (workerObject1) .build ()) .addAction (új Index.Builder (workerObject2) .build ()) .addAction ( új Delete.Builder ("17"). build ()) .build ());

5. Aszinkron műveletek

A Jest kliens az aszinkron műveleteket is támogatja, ami azt jelenti, hogy a fenti műveletek bármelyikét elvégezhetjük nem blokkoló I / O használatával.

Ha egy műveletet aszinkron módon kíván meghívni, egyszerűen használja a executeAsync az ügyfél módszere:

jestClient.executeAsync (új Index.Builder (workerObject1) .build (), új JestResultHandler () {@Override public void elkészült (JestResult eredmény) {// kezelési eredmény} @Override public void sikertelen (ex kivétel ex) {// kivétel kivétel }});

Vegye figyelembe, hogy a művelet (ebben az esetben indexelés) mellett az aszinkron áramláshoz a JestResultHandler. A Jest kliens ezt az objektumot hívja meg, amikor a művelet befejeződött. A felületnek két módszere van - elkészült és nem sikerült - amelyek lehetővé teszik a művelet sikerének vagy kudarcának kezelését.

6. Következtetés

Ebben az oktatóanyagban röviden áttekintettük a Jest klienst, egy RESTful Java klienst az Elasticsearch számára.

Noha a funkcióinak csak egy kis részét ismertettük, egyértelmű, hogy a Jest robusztus Elasticsearch kliens. Folyékony építőosztályai és RESTful interfészei megkönnyítik a tanulást, az Elasticsearch interfészek teljes körű támogatása pedig a natív kliens alternatívája.

Mint mindig, az oktatóanyag összes kódpéldája lejárt a GitHubon.


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