Guide til Elasticsearch i Java

1. Oversikt

I denne artikkelen skal vi dykke ned i noen nøkkelbegreper relatert til søkemotorer i fulltekst, med spesielt fokus på elastisk søk.

Siden dette er en Java-orientert artikkel, skal vi ikke gi en detaljert trinnvis veiledning om hvordan du setter opp elastisksøk og viser hvordan det fungerer under panseret. I stedet skal vi målrette mot Java-klienten, og hvordan du bruker hovedfunksjonene som indeks, slett, og Søk.

2. Oppsett

For enkelhets skyld vil vi bruke et dockerbilde for vår Elasticsearch-forekomst enhver Elasticsearch-forekomst som lytter på port 9200 vil gjøre det.

Vi starter med å skyte opp Elasticsearch-forekomsten:

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

Som standard lytter Elasticsearch på 9200-porten for kommende HTTP-spørsmål. Vi kan bekrefte at den er vellykket lansert ved å åpne // lokal vert: 9200 / URL i favorittleseren din:

{"name": "M4ojISw", "cluster_name": "docker-cluster", "cluster_uuid": "CNnjvDZzRqeVP-B04D3CmA", "version": {"number": "7.6.2", "build_flavor": "default "," 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": "Du vet, for søk"}

3. Maven-konfigurasjon

Nå som vi har vår grunnleggende Elasticsearch-klynge i gang, la oss hoppe rett til Java-klienten. Først og fremst må vi få følgende Maven-avhengighet erklært i vår pom.xml fil:

 org.elasticsearch elasticsearch 7.6.2 

Du kan alltid sjekke de nyeste versjonene som er hostet av Maven Central med lenken som er gitt før.

4. Java API

Før vi hopper rett til hvordan du bruker de viktigste Java API-funksjonene, må vi starte RestHighLevelClient:

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

4.1. Indeksere dokumenter

De indeks () gjør det mulig å lagre et vilkårlig JSON-dokument og gjøre det søkbart:

@Test offentlig ugyldig gittJsonString_whenJavaObject_thenIndexDocument () {String jsonObject = "{\" age \ ": 10, \" dateOfBirth \ ": 1471466076564," + "\" fullName \ ": \" John Doe \ "}"; IndexRequest-forespørsel = ny IndexRequest ("folk"); request.source (jsonObject, XContentType.JSON); IndexResponse respons = client.index (forespørsel, RequestOptions.DEFAULT); Strengindeks = respons.getIndex (); lang versjon = respons.getVersion (); assertEquals (Result.CREATED, response.getResult ()); assertEquals (1, versjon); assertEquals ("folk", indeks); }

Merk at det er mulig å bruke hvilket som helst JSON Java-bibliotek for å opprette og behandle dokumentene dine. Hvis du ikke er kjent med noen av disse, kan du bruke Elasticsearch-hjelpere til å generere dine egne JSON-dokumenter:

XContentBuilder builder = XContentFactory.jsonBuilder () .startObject () .field ("fullName", "Test") .field ("dateOfBirth", new Date ()) .field ("age", "10") .endObject () ; IndexRequest indexRequest = ny IndexRequest ("folk"); indexRequest.source (byggherre); IndexResponse respons = client.index (indexRequest, RequestOptions.DEFAULT); assertEquals (Result.CREATED, response.getResult ());

4.2. Spørre om indekserte dokumenter

Nå som vi har et skrevet JSON-dokument som er skrevet, er indeksert, kan vi fortsette og søke ved hjelp av Søk() metode:

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

Resultatene returnert av Søk() metoden kalles Treff, Hver Truffet refererer til et JSON-dokument som samsvarer med en søkeforespørsel.

I dette tilfellet resultater listen inneholder alle dataene som er lagret i klyngen. Merk at i dette eksemplet bruker vi FastJson-biblioteket for å konvertere JSON Strenger til Java-objekter.

Vi kan forbedre forespørselen ved å legge til flere parametere for å tilpasse spørringen ved hjelp av QueryBuilders metoder:

SearchSourceBuilder builder = new SearchSourceBuilder () .postFilter (QueryBuilders.rangeQuery ("age"). From (5) .to (15)); SearchRequest searchRequest = ny SearchRequest (); searchRequest.searchType (SearchType.DFS_QUERY_THEN_FETCH); searchRequest.source (byggherre); SearchResponse respons = client.search (searchRequest, RequestOptions.DEFAULT);

4.3. Henter og sletter dokumenter

De få() og slett() metoder tillater å hente eller slette et JSON-dokument fra klyngen ved hjelp av id-en:

GetRequest getRequest = ny GetRequest ("folk"); getRequest.id (id); GetResponse getResponse = client.get (getRequest, RequestOptions.DEFAULT); // prosessfelt DeleteRequest deleteRequest = ny DeleteRequest ("folk"); deleteRequest.id (id); DeleteResponse deleteResponse = client.delete (deleteRequest, RequestOptions.DEFAULT);

Syntaksen er ganske grei, du trenger bare å spesifisere indeksen ved siden av objektets id.

5. QueryBuilders Eksempler

De QueryBuilders klasse gir en rekke statiske metoder som brukes som dynamiske matchere for å finne spesifikke oppføringer i klyngen. Mens du bruker Søk() metode for å lete etter spesifikke JSON-dokumenter i klyngen, kan vi bruke spørrebyggere til å tilpasse søkeresultatene.

Her er en liste over de vanligste bruken av QueryBuilders API.

De matchAllQuery () metoden returnerer a QueryBuilder objekt som samsvarer med alle dokumenter i klyngen:

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery ();

De rangeQuery () samsvarer med dokumenter der et felts verdi ligger innenfor et bestemt område:

QueryBuilder matchDocumentsWithinRange = QueryBuilders .rangeQuery ("pris"). Fra (15) .to (100)

Å gi et feltnavn - f.eks. fullt navnog den tilsvarende verdien - f.eks. John Doe, The matchQuery () metoden samsvarer med alle dokumentene med denne eksakte feltverdien:

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

Vi kan like godt bruke multiMatchQuery () metode for å bygge en flerfeltversjon av treffsøket:

QueryBuilder matchSpecificFieldQuery = QueryBuilders.matchQuery ("Tekst jeg leter etter", "field_1", "field_2 ^ 3", "* _field_wildcard");

Vi kan bruke vekselsymbolet (^) for å øke spesifikke felt.

I vårt eksempel felt_2 har boost-verdi satt til tre, noe som gjør den viktigere enn de andre feltene. Merk at det er mulig å bruke jokertegn og regex-spørsmål, men ytelsesmessig, pass på minneforbruk og responstidsforsinkelse når du arbeider med jokertegn, fordi noe sånt som * _apples kan gi stor innvirkning på ytelsen.

Viktighetskoeffisienten brukes til å bestille resultat settet med treff som returneres etter at s er utførtearch () metode.

Hvis du er mer kjent med syntaksen for Lucene-spørsmål, kan du bruke simpleQueryStringQuery () metode for å tilpasse søk:

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

Som du sikkert kan gjette, vi kan bruke Lucene's Query Parser-syntaks til å lage enkle, men kraftige spørsmål. Her er noen grunnleggende operatører som kan brukes sammen med OG / ELLER / IKKE operatører for å lage søk:

  • Den nødvendige operatøren (+): krever at et bestemt stykke tekst eksisterer et sted i felt i et dokument.
  • Den forbyr operatøren (): ekskluderer alle dokumenter som inneholder et nøkkelord deklarert etter () symbol.

6. Konklusjon

I denne raske artikkelen har vi sett hvordan du bruker ElasticSearchs Java API til å utføre noen av de vanlige funksjonene relatert til søkemotorer i fulltekst.

Du kan sjekke ut eksemplet i denne artikkelen i GitHub-prosjektet.


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