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.