Vejledning til elastiksøgning i Java

1. Oversigt

I denne artikel vil vi dykke ned i nogle nøglebegreber relateret til søgemaskiner i fuldtekst med særligt fokus på Elasticsearch.

Da dette er en Java-orienteret artikel, vil vi ikke give en detaljeret trin-for-trin vejledning om, hvordan du opsætter elastiksøgning og viser, hvordan det fungerer under emhætten. I stedet skal vi målrette mod Java-klienten, og hvordan man bruger de vigtigste funktioner som indeks, slet, og Søg.

2. Opsætning

Af hensyn til enkelheden bruger vi dog et dockerbillede til vores Elasticsearch-forekomst enhver Elasticsearch-instans, der lytter på port 9200, gør det.

Vi starter med at starte vores Elasticsearch-forekomst:

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

Som standard lytter Elasticsearch i 9200-porten efter kommende HTTP-forespørgsler. Vi kan kontrollere, at det er lanceret med succes ved at åbne // localhost: 9200 / URL i din yndlingsbrowser:

{"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 ved, til søgning"}

3. Maven-konfiguration

Nu hvor vi har vores grundlæggende Elasticsearch-klynge i gang, lad os springe direkte til Java-klienten. Først og fremmest skal vi have følgende Maven-afhængighed erklæret i vores pom.xml fil:

 org.elasticsearch elasticsearch 7.6.2 

Du kan altid kontrollere de nyeste versioner, der er hostet af Maven Central med det link, der er angivet før.

4. Java API

Før vi hopper direkte til, hvordan man bruger de vigtigste Java API-funktioner, skal vi starte RestHighLevelClient:

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

4.1. Indeksering af dokumenter

Det indeks() funktion gør det muligt at gemme et vilkårligt JSON-dokument og gøre det søgbart:

@Test offentligt ugyldigt givetJsonString_whenJavaObject_thenIndexDocument () {String jsonObject = "{\" age \ ": 10, \" dateOfBirth \ ": 1471466076564," + "\" fullName \ ": \" John Doe \ "}"; IndexRequest anmodning = ny IndexRequest ("folk"); request.source (jsonObject, XContentType.JSON); IndexResponse respons = client.index (anmodning, RequestOptions.DEFAULT); Strengindeks = respons.getIndex (); lang version = respons.getVersion (); assertEquals (Result.CREATED, response.getResult ()); assertEquals (1, version); assertEquals ("folk", indeks); }

Bemærk, at det er muligt at bruge ethvert JSON Java-bibliotek at oprette og behandle dine dokumenter. Hvis du ikke er bekendt med nogen af ​​disse, kan du bruge Elasticsearch-hjælpere til at 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 (builder); IndexResponse respons = client.index (indexRequest, RequestOptions.DEFAULT); assertEquals (Result.CREATED, response.getResult ());

4.2. Forespørgsel på indekserede dokumenter

Nu hvor vi har et indtastet, søgbart JSON-dokument indekseret, kan vi fortsætte og søge ved hjælp af Søg() 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 ());

Resultaterne returneret af Søg() metode kaldes Hits, hver Hit henviser til et JSON-dokument, der matcher en søgeanmodning.

I dette tilfælde er resultater listen indeholder alle de data, der er gemt i klyngen. Bemærk, at i dette eksempel bruger vi FastJson-biblioteket til at konvertere JSON Strenge til Java-objekter.

Vi kan forbedre anmodningen ved at tilføje yderligere parametre for at tilpasse forespørgslen ved hjælp af QueryBuilders metoder:

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

4.3. Hentning og sletning af dokumenter

Det få() og slet() metoder tillader at hente eller slette et JSON-dokument fra klyngen ved hjælp af dets id:

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

Syntaksen er ret ligetil, du skal bare angive indekset sammen med objektets id.

5. QueryBuilders Eksempler

Det QueryBuilders klasse giver en række statiske metoder, der bruges som dynamiske matchere til at finde specifikke poster i klyngen. Mens du bruger Søg() metode til at lede efter specifikke JSON-dokumenter i klyngen, kan vi bruge forespørgselsbyggere til at tilpasse søgeresultaterne.

Her er en liste over de mest almindelige anvendelser af QueryBuilders API.

Det matchAllQuery () metode returnerer a QueryBuilder objekt, der matcher alle dokumenter i klyngen:

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery ();

Det rangeQuery () matcher dokumenter, hvor et felts værdi ligger inden for et bestemt interval:

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

Tilvejebringelse af et feltnavn - f.eks. fulde navnog den tilsvarende værdi - f.eks. John Doe, Det matchQuery () metoden matcher alle dokumenter med denne nøjagtige feltværdi:

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

Vi kan lige så godt bruge multiMatchQuery () metode til at oprette en multi-felts version af matchforespørgslen:

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

Vi kan bruge caret-symbolet (^) til at booste specifikke felter.

I vores eksempel er felt_2 har boost-værdi sat til tre, hvilket gør den vigtigere end de andre felter. Bemærk, at det er muligt at bruge jokertegn og regex-forespørgsler, men præstationsmæssigt skal du passe på hukommelsesforbrug og responstidsforsinkelse, når du beskæftiger dig med jokertegn, fordi noget som * _apples kan medføre en enorm indflydelse på ydeevnen.

Vigtighedskoefficienten bruges til at ordne resultatsættet af hits, der returneres efter udførelse af search () metode.

Hvis du er mere fortrolig med Lucene-forespørgslens syntaks, kan du bruge simpleQueryStringQuery () metode til at tilpasse søgeforespørgsler:

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

Som du sikkert kan gætte, vi kan bruge Lucenes Query Parser-syntaks til at opbygge enkle, men alligevel stærke forespørgsler. Her er nogle grundlæggende operatører, der kan bruges sammen med OG / ELLER / IKKE operatører til at oprette søgeforespørgsler:

  • Den krævede operatør (+): kræver, at der findes et bestemt stykke tekst et eller andet sted i felterne i et dokument.
  • Den forbyder operatør (): ekskluderer alle dokumenter, der indeholder et nøgleord, der er erklæret efter () symbol.

6. Konklusion

I denne hurtige artikel har vi set, hvordan man bruger ElasticSearchs Java API til at udføre nogle af de almindelige funktioner relateret til søgemaskiner i fuldtekst.

Du kan tjekke eksemplet i denne artikel i GitHub-projektet.


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