Uvod u Spring Data Elasticsearch

1. Pregled

U ovom vodiču, istražit ćemo osnove Spring Data Elasticsearch na kodiran i praktičan način.

Pokazat ćemo kako indeksirati, pretraživati ​​i postavljati upite za Elasticsearch u proljetnoj aplikaciji pomoću Spring Data Elasticsearch. Spring Data Elasticseach je Spring modul koji implementira Spring Data pružajući tako način interakcije s popularnom tražilicom koja se temelji na Lucenu.

Iako Elasticsearch može raditi bez teško definirane sheme, uobičajena je praksa dizajnirati je i stvoriti mapiranja navodeći vrstu podataka koja se očekuje u određenim poljima. Kada se dokument indeksira, njegova se polja obrađuju prema vrstama. Na primjer, tekstualno polje bit će tokenizirano i filtrirano prema pravilima mapiranja. Mogli bismo stvoriti i vlastite filtre i tokenizere.

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

2. Proljetni podaci

Opružni podaci pomažu u izbjegavanju šifre uzorka. Na primjer, ako definiramo sučelje spremišta koje proširuje ElasticsearchRepository sučelje koje pruža Spring Data Elasticsearch, CRUD operacije za odgovarajuću klasu dokumenata bit će prema zadanim postavkama dostupne.

Uz to, jednostavnim deklariranjem metoda s imenima u unaprijed definiranom formatu generiraju nam se implementacije metoda - nema potrebe za pisanjem implementacije sučelja spremišta.

Baeldung vodiči za Spring Data pružaju osnovne stvari za početak teme.

2.1. Ovisnost Mavena

Spring Data Elasticsearch pruža Java API za tražilicu. Da bismo je mogli koristiti, moramo dodati novu ovisnost o pom.xml:

 org.springframework.data spring-data-elasticsearch 4.0.0.Opusti 

2.2. Definiranje sučelja spremišta

Da bismo definirali nova spremišta, proširujemo jedno od ponuđenih sučelja spremišta, zamjenjujući generičke tipove našim stvarnim vrstama dokumenata i primarnih ključeva.

Važno je to napomenuti ElasticsearchRepository proteže se od PagingAndSortingRepository. To omogućuje ugrađenu podršku za paginiranje i sortiranje.

U našem primjeru koristit ćemo značajku straničenja u našim prilagođenim metodama pretraživanja:

javno sučelje ArticleRepository proširuje ElasticsearchRepository {Stranica findByAuthorsName (naziv niza, dostupno za stranicu); @Query ("{\" bool \ ": {\" must \ ": [{\" match \ ": {\" author.name \ ": \"? 0 \ "}}]}" ") stranica findByAuthorsNameUsingCustomQuery (Naziv niza, stranica koja se može stranicati); }

Uz findByAuthorsName metodu, proxy spremišta stvorit će implementaciju na temelju naziva metode. Algoritam razlučivanja utvrdit će da treba pristupiti autori i zatim pretražite Ime svojstvo svake stavke.

Druga metoda, findByAuthorsNameUsingCustomQuery, koristi prilagođeni logički upit Elasticsearch, definiran pomoću @Query napomena koja zahtijeva strogo podudaranje između imena autora i navedenog Ime argument.

2.3. Java konfiguracija

Kada konfiguriramo Elasticsearch u našoj Java aplikaciji, moramo definirati način povezivanja s instancom Elasticsearch. Za to koristimo a RestHighLevelClient što nudi ovisnost Elasticsearch:

@Configuration @EnableElasticsearchRepositories (basePackages = "com.baeldung.spring.data.es.repository") @ComponentScan (basePackages = {"com.baeldung.spring.data.es.service"}) javna klasa Config {@Bean public RestHighLevel client () {ClientConfiguration clientConfiguration = ClientConfiguration.builder () .connectedTo ("localhost: 9200") .build (); vratiti RestClients.create (clientConfiguration) .rest (); } @Bean public ElasticsearchOperations elasticsearchTemplate () {return new ElasticsearchRestTemplate (client ()); }}

Koristimo standardnu ​​napomenu u stilu s proljećem. @EnableElasticsearchRepositories natjerat će Spring Data Elasticsearch da skenira ponuđeni paket za spremišta Spring Data.

Da bismo komunicirali s našim Elasticsearch poslužiteljem, koristimo jednostavan RestHighLevelClient. Iako Elasticsearch pruža više vrsta klijenata, koristeći RestHighLevelClient je dobar način za buduću komunikaciju s poslužiteljem.

Napokon smo postavili ElasticsearchOperations bean za izvršavanje operacija na našem poslužitelju. U ovom slučaju instanciramo ElasticsearchRestTemplate.

3. Mapiranja

Mapiranja se koriste za definiranje sheme za naše dokumente. Definiranjem sheme za naše dokumente, štitimo ih od neželjenih ishoda, poput mapiranja na vrstu koju ne bismo željeli.

Naš je entitet jednostavan dokument nazvan Članak gdje je iskaznica je tipa Niz. Također preciziramo da takvi dokumenti moraju biti pohranjeni u indeks s imenom blog unutar članak tip.

@Document (indexName = "blog", type = "article") javna klasa Article {@Id private String id; privatni naslov niza; @Field (type = FieldType.Nested, includeInParent = true) autori privatnog popisa; // standardni geteri i postavljači}

Kazala mogu imati nekoliko vrsta. Tu značajku možemo koristiti za implementaciju hijerarhija.

The autori polje je označeno kao Vrsta polja.Nostirano. To nam omogućuje da definiramo Autor klase zasebno, ali neka su pojedinačni primjeri autora ugrađeni u Članak dokument kada je indeksiran u Elasticsearch.

4. Indeksiranje dokumenata

Spring Data Elasticsearch obično automatski kreira indekse na temelju entiteta u projektu. Međutim, indeks također možemo programski stvoriti putem klijentskog predloška:

elasticsearchTemplate.indexOps (Article.class) .create ();

Zatim u indeks možemo dodati dokumente:

Članak članka = novi članak ("Spring Data Elasticsearch"); article.setAuthors (asList (novi autor ("John Smith"), novi autor ("John Doe"))); articleRepository.save (članak);

5. Upit

5.1. Upit zasnovan na imenu metode

Kada koristimo upit temeljen na imenu metode, pišemo metode koje definiraju upit koji želimo izvršiti. Tijekom postavljanja, Spring Data će raščlaniti potpis metode i prema tome stvoriti upite:

String nameToFind = "John Smith"; Article articleByAuthorName = articleRepository.findByAuthorsName (nameToFind, PageRequest.of (0, 10));

Pozivanjem findByAuthorsName s Zahtjev za stranicu objekt dobivamo prvu stranicu rezultata (numeriranje stranica temelji se na nuli), a ta stranica sadrži najviše 10 članaka. Objekt stranice također pruža ukupan broj pogodaka za upit zajedno s ostalim praktičnim informacijama o paginaciji.

5.2. Prilagođeni upit

Postoji nekoliko načina za definiranje prilagođenih upita za spremišta Spring Data Elasticsearch. Jedan od načina je korištenje @Query napomena, kao što je prikazano u odjeljku 2.2.

Druga mogućnost je upotreba graditelja upita za izradu našeg prilagođenog upita.

Treba tražiti članke koji imaju riječ „podaci"U naslovu bismo mogli stvoriti NativeSearchQueryBuilder s filtrom na titula:

Upit searchQuery = novi NativeSearchQueryBuilder () .withFilter (regexpQuery ("naslov", ". * Podaci. *")) .Build (); Članci SearchHits = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("blog");

6. Ažuriranje i brisanje

Da bismo ažurirali dokument, prvo ga moramo dohvatiti:

String articleTitle = "Spring Data Elasticsearch"; Upit searchQuery = novi NativeSearchQueryBuilder () .withQuery (matchQuery ("title", articleTitle) .minimumShouldMatch ("75%")) .build (); Članci SearchHits = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("blog"); Article article = articles.getSearchHit (0) .getContent ();

Tada možemo izmijeniti dokument samo uređivanjem sadržaja predmeta pomoću njegovih procjenitelja:

article.setTitle ("Početak rada s pretraživačima"); articleRepository.save (članak);

Što se tiče brisanja, postoji nekoliko mogućnosti. Dokument možemo dohvatiti i izbrisati pomoću izbrisati metoda:

articleRepository.delete (article);

Također ga možemo izbrisati do iskaznica kad se zna:

articleRepository.deleteById ("article_id");

Također je moguće stvoriti običaj deleteBy upite i iskoristite značajku skupnog brisanja koju nudi Elasticsearch:

articleRepository.deleteByTitle ("naslov");

7. Zaključak

U ovom uputstvu istražili smo kako povezati i iskoristiti Spring Data Elasticsearch. Razgovarali smo o tome kako možemo postavljati upite, ažurirati i brisati dokumente. Štoviše, razgovarali smo i o tome kako stvoriti prilagođene upite i oni ne odgovaraju onome što nudi Spring Data Elasticsearch.

Kao i obično, izvorni kod korišten u ovom vodiču možete pronaći na GitHubu.