Gids voor Elasticsearch in Java

1. Overzicht

In dit artikel gaan we dieper in op enkele sleutelconcepten met betrekking tot full-text zoekmachines, met een speciale focus op Elasticsearch.

Omdat dit een Java-georiënteerd artikel is, gaan we geen gedetailleerde stapsgewijze zelfstudie geven over het instellen van Elasticsearch en laten zien hoe het onder de motorkap werkt. In plaats daarvan gaan we ons richten op de Java-client en hoe we de belangrijkste functies zoals inhoudsopgave, verwijderen, krijgen en zoeken.

2. Installatie

Eenvoudigheidshalve gebruiken we echter een docker-afbeelding voor onze Elasticsearch-instantie elke Elasticsearch-instantie die luistert op poort 9200 is voldoende.

We beginnen met het opstarten van onze Elasticsearch-instantie:

docker run -d --name es762 -p 9200: 9200 -e "discovery.type = single-node" elasticsearch: 7.6.2

Standaard luistert Elasticsearch op de 9200-poort voor aankomende HTTP-query's. We kunnen verifiëren dat het met succes is gestart door het // localhost: 9200 / URL in uw favoriete browser:

{"name": "M4ojISw", "cluster_name": "docker-cluster", "cluster_uuid": "CNnjvDZzRqeVP-B04D3CmA", "version": {"number": "7.6.2", "build_flavor": "standaard "," build_type ":" docker "," build_hash ":" 2f4c224 "," build_date ":" 2020-03-18T23: 22: 18.622755Z "," build_snapshot ": false," lucene_version ":" 8.4.0 " , "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.8.0-beta1"}, "tagline": "Weet je, voor zoeken"}

3. Maven-configuratie

Nu we ons basis Elasticsearch-cluster in gebruik hebben, gaan we meteen naar de Java-client. Allereerst moeten we de volgende Maven-afhankelijkheid hebben verklaard in onze pom.xml het dossier:

 org.elasticsearch elasticsearch 7.6.2 

U kunt altijd de nieuwste versies bekijken die door de Maven Central worden gehost met de eerder verstrekte link.

4. Java-API

Voordat we meteen beginnen met het gebruik van de belangrijkste Java API-functies, moeten we het RestHighLevelClient:

ClientConfiguration clientConfiguration = ClientConfiguration.builder (). ConnectedTo ("localhost: 9200"). Build (); RestHighLevelClient client = RestClients.create (clientConfiguration) .rest ();

4.1. Documenten indexeren

De inhoudsopgave() functie maakt het mogelijk om een ​​willekeurig JSON-document op te slaan en doorzoekbaar te maken:

@Test openbare leegte gegevenJsonString_whenJavaObject_thenIndexDocument () {String jsonObject = "{\" leeftijd \ ": 10, \" dateOfBirth \ ": 1471466076564," + "\" fullName \ ": \" Jan Doe \ "}"; IndexRequest request = nieuw IndexRequest ("mensen"); request.source (jsonObject, XContentType.JSON); IndexResponse response = client.index (verzoek, RequestOptions.DEFAULT); String index = response.getIndex (); lange versie = response.getVersion (); assertEquals (Result.CREATED, response.getResult ()); assertEquals (1, versie); assertEquals ("mensen", index); }

Merk op dat het mogelijk is om elke JSON Java-bibliotheek om uw documenten te creëren en te verwerken. Als u deze niet kent, kunt u Elasticsearch-helpers gebruiken om uw eigen JSON-documenten te genereren:

XContentBuilder builder = XContentFactory.jsonBuilder () .startObject () .field ("fullName", "Test") .field ("dateOfBirth", nieuwe datum ()) .field ("leeftijd", "10") .endObject () ; IndexRequest indexRequest = nieuwe IndexRequest ("mensen"); indexRequest.source (bouwer); IndexResponse response = client.index (indexRequest, RequestOptions.DEFAULT); assertEquals (Result.CREATED, response.getResult ());

4.2. Geïndexeerde documenten opvragen

Nu we een getypt doorzoekbaar JSON-document hebben geïndexeerd, kunnen we doorgaan en zoeken met behulp van de zoeken() methode:

SearchRequest searchRequest = nieuwe SearchRequest (); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT); SearchHit [] searchHits = response.getHits (). GetHits (); Lijstresultaten = Arrays.stream (searchHits) .map (hit -> JSON.parseObject (hit.getSourceAsString (), Person.class)) .collect (Collectors.toList ());

De resultaten die worden geretourneerd door de zoeken() methode worden genoemd Hits, elk Raken verwijst naar een JSON-document dat overeenkomt met een zoekopdracht.

In dit geval is het resultaten lijst bevat alle gegevens die in het cluster zijn opgeslagen. Merk op dat we in dit voorbeeld de FastJson-bibliotheek gebruiken om JSON te converteren Snaren naar Java-objecten.

We kunnen het verzoek verbeteren door extra parameters toe te voegen om de query aan te passen met de QueryBuilders methoden:

SearchSourceBuilder builder = nieuwe SearchSourceBuilder () .postFilter (QueryBuilders.rangeQuery ("leeftijd"). Van (5). Tot (15)); SearchRequest searchRequest = nieuwe SearchRequest (); searchRequest.searchType (SearchType.DFS_QUERY_THEN_FETCH); searchRequest.source (bouwer); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT);

4.3. Documenten ophalen en verwijderen

De krijgen() en verwijderen() methoden staan ​​toe om een ​​JSON-document uit het cluster op te halen of te verwijderen met behulp van zijn id:

GetRequest getRequest = nieuwe GetRequest ("mensen"); getRequest.id (id); GetResponse getResponse = client.get (getRequest, RequestOptions.DEFAULT); // procesvelden DeleteRequest deleteRequest = nieuwe DeleteRequest ("mensen"); deleteRequest.id (id); DeleteResponse deleteResponse = client.delete (deleteRequest, RequestOptions.DEFAULT);

De syntaxis is vrij eenvoudig, u hoeft alleen de index op te geven naast de id van het object.

5. QueryBuilders Voorbeelden

De QueryBuilders class biedt een verscheidenheid aan statische methoden die worden gebruikt als dynamische matchers om specifieke vermeldingen in het cluster te vinden. Tijdens het gebruik van de zoeken() methode om naar specifieke JSON-documenten in het cluster te zoeken, kunnen we querybuilders gebruiken om de zoekresultaten aan te passen.

Hier is een lijst met de meest voorkomende toepassingen van de QueryBuilders API.

De matchAllQuery () methode retourneert een QueryBuilder object dat overeenkomt met alle documenten in het cluster:

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery ();

De rangeQuery () komt overeen met documenten waarvan de waarde van een veld binnen een bepaald bereik valt:

QueryBuilder matchDocumentsWithinRange = QueryBuilders .rangeQuery ("prijs"). Van (15). Tot (100)

Een veldnaam opgeven - bijv. voor-en achternaam, en de bijbehorende waarde - bijv. John Doe, De matchQuery () methode komt overeen met alle documenten met deze exacte veldwaarde:

QueryBuilder matchSpecificFieldQuery = QueryBuilders .matchQuery ("fullName", "John Doe");

We kunnen net zo goed de multiMatchQuery () methode om een ​​versie met meerdere velden van de matchquery te bouwen:

QueryBuilder matchSpecificFieldQuery = QueryBuilders.matchQuery ("Tekst die ik zoek", "field_1", "field_2 ^ 3", "* _field_wildcard");

We kunnen het caret-symbool (^) gebruiken om specifieke velden een boost te geven.

In ons voorbeeld is de veld_2 heeft de boostwaarde ingesteld op drie, waardoor deze belangrijker is dan de andere velden. Merk op dat het mogelijk is om jokertekens en regex-queries te gebruiken, maar let qua prestaties op het geheugengebruik en de vertraging in de responstijd bij het omgaan met jokertekens, omdat zoiets als * _apples een enorme impact kan hebben op de prestaties.

De belangrijkheidscoëfficiënt wordt gebruikt om de resultaatset van treffers te ordenen die worden geretourneerd na het uitvoeren van de soorschelp methode.

Als u meer bekend bent met de syntaxis van Lucene-query's, kunt u de simpleQueryStringQuery () methode om zoekopdrachten aan te passen:

QueryBuilder simpleStringQuery = QueryBuilders .simpleQueryStringQuery ("+ John -Doe OF Janette");

Zoals je waarschijnlijk wel kunt raden, we kunnen de Query Parser-syntaxis van Lucene gebruiken om eenvoudige, maar krachtige query's te maken. Hier zijn enkele basisoperatoren die naast de EN / OF / NIET operators om zoekopdrachten op te bouwen:

  • De vereiste operator (+): vereist dat een specifiek stuk tekst ergens in velden van een document bestaat.
  • De verbieden operator (): sluit alle documenten uit die een trefwoord bevatten dat is gedeclareerd na de () symbool.

6. Conclusie

In dit korte artikel hebben we gezien hoe we de ElasticSearch's Java API kunnen gebruiken om enkele van de algemene functies uit te voeren met betrekking tot full-text zoekmachines.

U kunt het voorbeeld in dit artikel bekijken in het GitHub-project.