Jest - Elasticsearch Java-client

1. Inleiding

Iedereen die met Elasticsearch heeft gewerkt, weet dat het bouwen van zoekopdrachten met behulp van hun RESTful-zoek-API vervelend en foutgevoelig kan zijn.

In deze tutorial kijken we naar Jest, een HTTP Java-client voor Elasticsearch. Hoewel Elasticsearch zijn eigen native Java-client biedt, Jest biedt een meer vloeiende API en eenvoudigere interfaces om mee te werken.

2. Maven Afhankelijkheid

Het eerste dat we moeten doen, is de Jest-bibliotheek in onze POM importeren:

 io.searchbox grap 6.3.1 

Het versiebeheer voor Jest volgt die van het belangrijkste Elasticsearch-product. Dit zorgt voor compatibiliteit tussen client en server.

Door de Jest-afhankelijkheid op te nemen, wordt de bijbehorende Elasticsearch-bibliotheek opgenomen als een transitieve afhankelijkheid.

3. Met behulp van Jest Client

In deze sectie zullen we kijken naar het gebruik van de Jest-client om veelvoorkomende taken met Elasticsearch uit te voeren.

Om de Jest-client te gebruiken, maken we eenvoudig een JestClient object met behulp van de JestClientFactory. Deze objecten zijn duur om te maken en zijn draadveilig, dus we zullen een singleton-instantie maken die door onze applicatie kan worden gedeeld:

openbare JestClient jestClient () {JestClientFactory factory = nieuwe JestClientFactory (); factory.setHttpClientConfig (nieuwe HttpClientConfig.Builder ("// localhost: 9200") .multiThreaded (true) .defaultMaxTotalConnectionPerRoute (2) .maxTotalConnection (10) .build ()); terugkeer factory.getObject (); }

Hiermee wordt een Jest-client gemaakt die is verbonden met een Elasticsearch-client die lokaal wordt uitgevoerd. Hoewel dit verbindingsvoorbeeld triviaal is, Jest biedt ook volledige ondersteuning voor proxy's, SSL, authenticatie en zelfs knooppuntdetectie.

De JestClient class is generiek en heeft slechts een handvol openbare methoden. De belangrijkste die we zullen gebruiken is uitvoeren, die een instantie van de Actie koppel. De Jest-client biedt verschillende builder-klassen om verschillende acties te maken die communiceren met Elasticsearch.

Het resultaat van alle Jest-oproepen is een instantie van JestResult. We kunnen het succes controleren door te bellen is geslaagd. Voor mislukte acties kunnen we bellen getErrorMessage voor meer details:

JestResult jestResult = jestClient.execute (nieuwe Delete.Builder ("1"). Index ("werknemers"). Build ()); if (jestResult.isSucceeded ()) {System.out.println ("Succes!"); } else {System.out.println ("Fout:" + jestResult.getErrorMessage ()); }

3.1. Indices beheren

Om te controleren of er een index bestaat, gebruiken we de Index bestaat actie:

JestResult resultaat = jestClient.execute (nieuwe IndicesExists.Builder ("werknemers"). Build ()) 

Om een ​​index te maken, gebruiken we de CreateIndex actie:

jestClient.execute (nieuwe CreateIndex.Builder ("werknemers"). build ());

Hiermee wordt een index gemaakt met standaardinstellingen. We kunnen specifieke instellingen overschrijven tijdens het maken van de index:

Kaartinstellingen = nieuwe HashMap (); settings.put ("number_of_shards", 11); settings.put ("number_of_replicas", 2); jestClient.execute (nieuwe CreateIndex.Builder ("werknemers"). instellingen (instellingen) .build ());

En het maken of wijzigen van aliassen is ook eenvoudig met de Wijzig aliassen actie:

jestClient.execute (nieuwe ModifyAliases.Builder (nieuwe AddAliasMapping.Builder ("werknemers", "e"). build ()). build ()); jestClient.execute (nieuwe ModifyAliases.Builder (nieuwe RemoveAliasMapping.Builder ("werknemers", "e"). build ()). build ());

3.2. Documenten aanmaken

De Jest-client maakt het gemakkelijk om nieuwe documenten te indexeren of te maken met de Inhoudsopgave actieklasse. Documenten in Elasticsearch zijn slechts JSON-gegevens, en er zijn meerdere manieren om JSON-gegevens door te geven aan de Jest-client voor indexering.

Laten we voor dit voorbeeld een denkbeeldig medewerkersdocument gebruiken:

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

De eerste manier om een ​​JSON-document weer te geven, is door Java te gebruiken Draad. Hoewel we de JSON-reeks handmatig kunnen maken, moeten we rekening houden met de juiste opmaak, accolades en ontsnappende aanhalingstekens.

Daarom is het gemakkelijker om een ​​JSON-bibliotheek zoals Jackson te gebruiken om onze JSON-structuur te bouwen en vervolgens om te zetten naar een Draad:

ObjectMapper-mapper = nieuwe ObjectMapper (); JsonNode medewerker JsonNode = 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 (nieuwe Index.Builder (employeeJsonNode.toString ()). index ("werknemers"). build ());

We kunnen ook een Java gebruiken Kaart om JSON-gegevens weer te geven en door te geven aan het Inhoudsopgave actie:

Map employeeHashMap = nieuwe LinkedHashMap (); employeeHashMap.put ("naam", "Michael Pratt"); employeeHashMap.put ("title", "Java Developer"); employeeHashMap.put ("yearsOfService", 2); employeeHashMap.put ("skills", Arrays.asList ("java", "spring", "elasticsearch")); jestClient.execute (nieuwe Index.Builder (employeeHashMap) .index ("medewerkers"). build ());

Ten slotte kan de Jest-client elke POJO accepteren die het te indexeren document vertegenwoordigt. Laten we zeggen dat we een Werknemer klasse:

openbare klasse Medewerker {Stringnaam; String titel; Lijst met vaardigheden; int yearsOfService; }

We kunnen een instantie van deze klasse rechtstreeks doorgeven aan de Inhoudsopgave bouwer:

Medewerker medewerker = nieuwe medewerker (); employee.setName ("Michael Pratt"); employee.setTitle ("Java Developer"); medewerker.setYearsOfService (2); employee.setSkills (Arrays.asList ("java", "spring", "elasticsearch")); jestClient.execute (nieuwe Index.Builder (werknemer) .index ("werknemers"). build ());

3.3. Documenten lezen

Er zijn twee primaire manieren om toegang te krijgen tot een document vanuit Elasticsearch met de Jest-client. Ten eerste: als we de document-ID kennen, kunnen we deze rechtstreeks openen met de Krijgen actie:

jestClient.execute (nieuwe Get.Builder ("werknemers", "17"). build ());

Om toegang te krijgen tot het teruggestuurde document, moeten we een van de verschillende bellen getSource methoden. We kunnen het resultaat krijgen als onbewerkte JSON of het deserialiseren naar een DTO:

Werknemer getResult = jestClient.execute (nieuwe Get.Builder ("werknemers", "1"). Build ()) .getSourceAsObject (Employee.class);

De andere manier om toegang te krijgen tot documenten is met behulp van een zoekopdracht, die in Jest is geïmplementeerd met de Zoeken actie.

Jest-client ondersteunt de volledige Elasticsearch-query DSL. Net als bij indexeringsbewerkingen, worden query's uitgedrukt als JSON-documenten en zijn er meerdere manieren om zoekopdrachten uit te voeren.

Ten eerste kunnen we een JSON-string doorgeven die de zoekopdracht vertegenwoordigt. Ter herinnering, we moeten ervoor zorgen dat de string correct is ontsnapt en geldig JSON is:

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

Net als bij de Inhoudsopgave actie hierboven, kunnen we een bibliotheek zoals Jackson gebruiken om onze JSON-queryreeks te bouwen.

Daarnaast kunnen we ook de native Elasticsearch-queryactie-API gebruiken. Het enige nadeel hiervan is dat onze applicatie afhankelijk moet zijn van de volledige Elasticsearch-bibliotheek.

Met de Zoeken actie, kunnen de overeenkomende documenten worden geopend met de getSource methoden. Echter, Jest biedt ook de Raken class, die de overeenkomende documenten verpakt en metagegevens over de resultaten levert. De ... gebruiken Raken klasse, hebben we toegang tot aanvullende metadata voor elk resultaat: score, routing en resultaten uitleggen, om er maar een paar te noemen:

Lijst searchResults = jestClient.execute (nieuwe Search.Builder (zoeken) .build ()) .getHits (Employee.class); searchResults.forEach (hit -> {System.out.println (String.format ("Document% s heeft score% s", hit.id, hit.score));});

3.4. Documenten bijwerken

Jest biedt een simpele Bijwerken actie voor het bijwerken van documenten:

werknemer.setYearOfService (3); jestClient.execute (nieuwe Update.Builder (werknemer) .index ("werknemers"). id ("1"). build ());

Het accepteert dezelfde JSON-representaties als het Inhoudsopgave actie die we eerder zagen, waardoor het gemakkelijk is om code tussen de twee bewerkingen te delen.

3.5. Documenten verwijderen

Het verwijderen van een document uit een index wordt gedaan met behulp van de Verwijderen actie. Het vereist alleen een indexnaam en document-ID:

jestClient.execute (nieuwe Delete.Builder ("17") .index ("werknemers") .build ());

4. Bulkbewerkingen

Jest-client ondersteunt ook bulkoperaties. Dit betekent dat we tijd en bandbreedte kunnen besparen door meerdere bewerkingen tegelijkertijd te verzenden.

De ... gebruiken Bulk actie, kunnen we een willekeurig aantal verzoeken combineren in een enkele oproep. We kunnen zelfs verschillende soorten verzoeken combineren:

jestClient.execute (nieuwe Bulk.Builder () .defaultIndex ("werknemers") .addAction (nieuwe Index.Builder (employeeObject1) .build ()) .addAction (nieuwe Index.Builder (employeeObject2) .build ()) .addAction ( nieuwe Delete.Builder ("17"). build ()) .build ());

5. Asynchrone bewerkingen

Jest-client ondersteunt ook asynchrone bewerkingen, wat betekent dat we elk van de bovenstaande bewerkingen kunnen uitvoeren met behulp van niet-blokkerende I / O.

Om een ​​bewerking asynchroon aan te roepen, gebruikt u gewoon de executeAsync methode van de opdrachtgever:

jestClient.executeAsync (nieuwe Index.Builder (employeeObject1) .build (), nieuwe JestResultHandler () {@Override public void voltooid (JestResult resultaat) {// handle resultaat} @Override public void mislukt (Exception ex) {// handle exception }});

Merk op dat naast de actie (in dit geval indexering), de asynchrone stroom ook een JestResultHandler. De Jest-client roept dit object aan als de actie is voltooid. De interface heeft twee methoden - voltooid en mislukt - die het mogelijk maken om respectievelijk het slagen of mislukken van de operatie af te handelen.

6. Conclusie

In deze tutorial hebben we kort gekeken naar de Jest-client, een RESTful Java-client voor Elasticsearch.

Hoewel we slechts een klein deel van de functionaliteit hebben behandeld, is het duidelijk dat Jest een robuuste Elasticsearch-client is. De vloeiende bouwklassen en RESTful-interfaces maken het gemakkelijk om te leren, en de volledige ondersteuning voor Elasticsearch-interfaces maken het een capabel alternatief voor de native client.

Zoals altijd zijn alle codevoorbeelden in de tutorial voorbij op GitHub.