Vodič za Elasticsearch na Javi

1. Pregled

U ovom ćemo članku zaroniti u neke ključne koncepte povezane s cjelovitim pretraživačima, s posebnim naglaskom na Elasticsearch.

Budući da je ovo članak orijentiran na Javu, nećemo davati detaljan korak-po-korak vodič o tome kako postaviti Elasticsearch i pokazati kako to radi ispod haube. Umjesto toga, ciljat ćemo Java klijenta i kako koristiti glavne značajke poput indeks, izbrisati, dobiti i traži.

2. Postavljanje

Radi jednostavnosti, za našu ćemo instancu Elasticsearch koristiti sliku dockera učinit će bilo koja instanca Elasticsearch koja preslušava na priključku 9200.

Započinjemo paljenjem naše instance Elasticsearch:

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

Prema zadanim postavkama, Elasticsearch preslušava na priključku 9200 za nadolazeće HTTP upite. Možemo provjeriti je li uspješno pokrenut otvaranjem programa // localhost: 9200 / URL u vašem omiljenom pregledniku:

{"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": "Znate, za pretraživanje"}

3. Konfiguracija Mavena

Sad kad imamo svoj osnovni Elasticsearch klaster i pokrenut, krenimo ravno na Java klijenta. Prije svega, moramo imati sljedeću ovisnost o Mavenu koja se deklarira u našoj pom.xml datoteka:

 org.elastičnotraženje elastičnotraženje 7.6.2 

Uvijek možete provjeriti najnovije verzije koje je domaćin Maven Central s prethodno navedenom vezom.

4. Java API

Prije nego što prijeđemo ravno na to kako koristiti glavne značajke Java API-a, moramo pokrenuti RestHighLevelClient:

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

4.1. Indeksiranje dokumenata

The indeks() funkcija omogućuje pohranu proizvoljnog JSON dokumenta i omogućavanje pretraživanja:

@Test javna praznina givenJsonString_whenJavaObject_thenIndexDocument () {String jsonObject = "{\" age \ ": 10, \" dateOfBirth \ ": 1471466076564," + "\" fullName \ ": \" John Doe \ "}"; Zahtjev za IndexRequest = novi IndexRequest ("ljudi"); request.source (jsonObject, XContentType.JSON); IndexResponse odgovor = client.index (zahtjev, RequestOptions.DEFAULT); Indeks niza = response.getIndex (); duga verzija = response.getVersion (); assertEquals (Rezultat.STVORENO, odgovor.getResult ()); assertEquals (1, verzija); assertEquals ("ljudi", indeks); }

Imajte na umu da je moguće koristiti bilo koja JSON Java knjižnica za stvaranje i obradu dokumenata. Ako niste upoznati ni s jednim od ovih, možete koristiti pomoćnike Elasticsearch za generiranje vlastitih JSON dokumenata:

XContentBuilder builder = XContentFactory.jsonBuilder () .startObject () .field ("fullName", "Test") .field ("dateOfBirth", new Date ()) .field ("age", "10") .endObject () ; IndexRequest indexRequest = novi IndexRequest ("ljudi"); indexRequest.source (graditelj); IndexResponse odgovor = client.index (indexRequest, RequestOptions.DEFAULT); assertEquals (Rezultat.STVORENO, odgovor.getResult ());

4.2. Upit indeksiranih dokumenata

Sad kad imamo indeksirani otkucani JSON dokument koji možemo pretraživati, možemo nastaviti i pretraživati ​​pomoću traži() metoda:

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

Rezultati koje je vratio traži() metoda se nazivaju Hitovi, svaki Pogoditi odnosi se na JSON dokument koji odgovara zahtjevu za pretraživanje.

U ovom slučaju, rezultatima Popis sadrži sve podatke pohranjene u klasteru. Imajte na umu da u ovom primjeru koristimo knjižnicu FastJson da bismo pretvorili JSON Žice Java objektima.

Zahtjev možemo poboljšati dodavanjem dodatnih parametara kako bismo prilagodili upit pomoću QueryBuilders metode:

SearchSourceBuilder graditelj = novi SearchSourceBuilder () .postFilter (QueryBuilders.rangeQuery ("dob"). Od (5) .to (15)); SearchRequest searchRequest = novi SearchRequest (); searchRequest.searchType (SearchType.DFS_QUERY_THEN_FETCH); searchRequest.source (graditelj); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT);

4.3. Dohvaćanje i brisanje dokumenata

The dobiti() i izbriši() metode omogućuju dobivanje ili brisanje JSON dokumenta iz klastera koristeći njegov id:

GetRequest getRequest = novi GetRequest ("ljudi"); getRequest.id (id); GetResponse getResponse = client.get (getRequest, RequestOptions.DEFAULT); // obraditi polja DeleteRequest deleteRequest = novi DeleteRequest ("ljudi"); deleteRequest.id (id); DeleteResponse deleteResponse = client.delete (deleteRequest, RequestOptions.DEFAULT);

Sintaksa je prilično jednostavna, samo trebate navesti indeks uz ID objekta.

5. QueryBuilders Primjeri

The QueryBuilders klasa pruža razne statičke metode koje se koriste kao dinamička podudaranja za pronalaženje određenih unosa u klasteru. Tijekom korištenja traži() metodu za traženje određenih JSON dokumenata u klasteru, možemo koristiti graditelje upita za prilagodbu rezultata pretraživanja.

Evo popisa najčešćih upotreba QueryBuilders API.

The matchAllQuery () metoda vraća a QueryBuilder objekt koji odgovara svim dokumentima u klasteru:

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery ();

The rangeQuery () odgovara dokumentima u kojima je vrijednost polja unutar određenog raspona:

QueryBuilder matchDocumentsWithinRange = QueryBuilders .rangeQuery ("cijena"). Od (15) .do (100)

Navođenje naziva polja - npr. puno ime, i odgovarajuća vrijednost - npr. John Doe, The matchQuery () metoda podudara sav dokument s točno navedenom vrijednošću polja:

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

Možemo i koristiti multiMatchQuery () metoda za izgradnju verzije upita za podudaranje s više polja:

QueryBuilder matchSpecificFieldQuery = QueryBuilders.matchQuery ("Tekst koji tražim", "field_1", "field_2 ^ 3", "* _field_wildcard");

Simbol karata (^) možemo koristiti za pojačavanje određenih polja.

U našem primjeru polje_2 ima vrijednost pojačanja postavljenu na tri, što je čini važnijom od ostalih polja. Imajte na umu da je moguće koristiti zamjenske znakove i upite za regularni izraz, ali kad je riječ o zamjenskim znakovima, čuvajte se potrošnje memorije i kašnjenja u vremenu odziva, jer nešto poput * _apples može imati velik utjecaj na izvedbu.

Koeficijent važnosti koristi se za naručivanje rezultata rezultata pogodaka vraćenih nakon izvršavanja search () metoda.

Ako ste više upoznati sa sintaksom upita Lucene, možete koristiti simpleQueryStringQuery () metoda za prilagodbu upita za pretraživanje:

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

Kao što vjerojatno možete pretpostaviti, sintaksu Lucene's Query Parser možemo koristiti za izgradnju jednostavnih, ali moćnih upita. Evo nekoliko osnovnih operatora koji se mogu koristiti uz I / ILI / NE operateri za izgradnju upita za pretraživanje:

  • Traženi operator (+): zahtijeva da određeni dio teksta postoji negdje u poljima dokumenta.
  • Operator zabrane (): izuzima sve dokumente koji sadrže ključnu riječ deklariranu nakon () simbol.

6. Zaključak

U ovom kratkom članku vidjeli smo kako koristiti Java API ElasticSearch-a za izvođenje nekih uobičajenih značajki povezanih s pretraživačima punog teksta.

Možete pogledati primjer naveden u ovom članku u projektu GitHub.