Introduksjon til Spring Data Elasticsearch

1. Oversikt

I denne veiledningen, vi vil utforske det grunnleggende om Spring Data Elasticsearch på en kodefokusert og praktisk måte.

Vi viser hvordan du indekserer, søker og spørrer om Elasticsearch i en Spring-applikasjon ved hjelp av Spring Data Elasticsearch. Spring Data Elasticseach er en Spring-modul som implementerer Spring Data, og tilbyr dermed en måte å samhandle med den populære Lucene-baserte søkemotoren med åpen kildekode.

Selv om Elasticsearch ikke kan fungere uten noe definert skjema, er det en vanlig praksis å designe en og lage kartlegginger som spesifiserer hvilken type data som kan forventes i visse felt. Når et dokument er indeksert, blir dets felt behandlet i henhold til deres typer. For eksempel blir et tekstfelt tokenisert og filtrert i henhold til kartleggingsregler. Vi kan også lage egne filtre og tokenisatorer.

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

2. Vårdata

Spring Data hjelper til med å unngå kjelekode. For eksempel hvis vi definerer et depotgrensesnitt som utvider ElasticsearchRepository grensesnitt levert av Spring Data Elasticsearch, CRUD-operasjoner for den tilsvarende dokumentklassen vil bli gjort tilgjengelig som standard.

I tillegg, ganske enkelt ved å erklære metoder med navn i et forhåndsdefinert format, genereres metodimplementeringer for oss - det er ikke nødvendig å skrive en implementering av depotgrensesnittet.

Baeldung-guidene om vårdata gir det viktigste for å komme i gang med emnet.

2.1. Maven avhengighet

Spring Data Elasticsearch tilbyr et Java API for søkemotoren. For å kunne bruke den, må vi legge til en ny avhengighet av pom.xml:

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

2.2. Definere lagringsgrensesnitt

For å definere nye arkiver utvider vi ett av de medfølgende lagringsgrensesnittene, og erstatter generiske typer med våre faktiske dokument- og primærnøkkeltyper.

Det er viktig å merke seg det ElasticsearchRepository strekker seg fra PagingAndSortingRepository. Dette tillater innebygd støtte for paginering og sortering.

I vårt eksempel vil vi bruke personsøkingsfunksjonen i våre tilpassede søkemetoder:

offentlig grensesnitt ArticleRepository utvider ElasticsearchRepository {Page findByAuthorsName (String name, Pageable pageable); @Query ("{\" bool \ ": {\" must \ ": [{\" match \ ": {\" author.name \ ": \"? 0 \ "}}]}}") Side findByAuthorsNameUsingCustomQuery (Navn på streng, Sidesider); }

Med findByAuthorsName metode, lager proxyen en implementering basert på metodens navn. Oppløsningsalgoritmen vil bestemme at den trenger tilgang til forfattere og søk deretter i Navn egenskapen til hvert element.

Den andre metoden, findByAuthorsNameUsingCustomQuery, bruker et egendefinert boolsk søk ​​Elasticsearch, definert ved hjelp av @Spørsmål kommentar, som krever streng samsvar mellom forfatterens navn og det oppgitte Navn argument.

2.3. Java-konfigurasjon

Når vi konfigurerer Elasticsearch i Java-applikasjonen vår, må vi definere hvordan vi kobler til Elasticsearch-forekomsten. Til det bruker vi en RestHighLevelClient som tilbys av Elasticsearch avhengighet:

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

Vi bruker en standard våraktiverte stilkommentarer. @EnableElasticsearchRepositories vil få Spring Data Elasticsearch til å skanne den medfølgende pakken for Spring Data-arkiver.

For å kommunisere med vår Elasticsearch-server, bruker vi en enkel RestHighLevelClient. Mens Elasticsearch tilbyr flere typer klienter, bruker du RestHighLevelClient er en god måte å fremtidssikre kommunikasjonen med serveren på.

Til slutt satte vi opp en ElasticsearchOperations bønne for å utføre operasjoner på serveren vår. I dette tilfellet instanserer vi en ElasticsearchRestTemplate.

3. Kartlegginger

Kartlegginger brukes til å definere et skjema for dokumentene våre. Ved å definere et skjema til dokumentene våre, beskytter vi dem mot uønskede resultater, for eksempel kartlegging til en type vi ikke vil ha.

Vår enhet er et enkelt dokument som heter Artikkel hvor i id er av typen String. Vi spesifiserer også at slike dokumenter må lagres i en indeks som heter blogg innen artikkel type.

@Document (indexName = "blog", type = "artikkel") public class Article {@Id private String id; privat strengetittel; @Field (type = FieldType.Nested, includeInParent = true) private forfattere av listen; // standard getters og setters}

Indekser kan ha flere typer. Vi kan bruke den funksjonen til å implementere hierarkier.

De forfattere felt er merket som Feltype. Nestet. Dette lar oss definere Forfatter klasse separat, men har de enkelte forfatterforekomster innebygd i en Artikkel dokument når det er indeksert i Elasticsearch.

4. Indeksere dokumenter

Spring Data Elasticsearch oppretter vanligvis indekser automatisk basert på enhetene i prosjektet. Vi kan imidlertid også lage en indeks programmatisk via klientmalen:

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

Deretter kan vi legge til dokumenter i indeksen:

Artikkelartikkel = ny artikkel ("Spring Data Elasticsearch"); article.setAuthors (asList (ny forfatter ("John Smith"), ny forfatter ("John Doe"))); articleRepository.save (artikkel);

5. Spørring

5.1. Metode Navnbasert spørring

Når vi bruker metodebasert spørring, skriver vi metoder som definerer spørringen vi vil utføre. Under oppsettet vil Spring Data analysere metodesignaturen og opprette spørsmålene deretter:

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

Ved å ringe findByAuthorsName med en PageRequest objekt, får vi den første siden med resultater (sidenummerering er nullbasert), med den siden som inneholder maksimalt 10 artikler. Sideobjektet gir også totalt antall treff for spørringen sammen med annen nyttig informasjon om paginering.

5.2. En tilpasset spørring

Det er et par måter å definere tilpassede spørsmål for Spring Data Elasticsearch-arkiver på. En måte er å bruke @Spørsmål kommentar, som vist i avsnitt 2.2.

Et annet alternativ er å bruke spørrebyggeren til å lage vårt tilpassede spørsmål.

Å måtte søke etter artikler som har ordet “data”I tittelen, kunne vi bare lage en NativeSearchQueryBuilder med et filter på tittel:

Query searchQuery = new NativeSearchQueryBuilder () .withFilter (regexpQuery ("title", ". * Data. *")) .Build (); SearchHits-artikler = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("blog");

6. Oppdatering og sletting

For å oppdatere et dokument, må vi først hente det:

String articleTitle = "Spring Data Elasticsearch"; Query searchQuery = new NativeSearchQueryBuilder () .withQuery (matchQuery ("title", articleTitle) .minShShMatch ("75%")) .build (); SearchHits-artikler = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("blog"); Article article = articles.getSearchHit (0) .getContent ();

Deretter kan vi gjøre endringer i dokumentet bare ved å redigere innholdet i objektet ved hjelp av vurdererne:

article.setTitle ("Komme i gang med søkemotorer"); articleRepository.save (artikkel);

Når det gjelder sletting, er det flere alternativer. Vi kan hente dokumentet og slette det ved hjelp av slett metode:

articleRepository.delete (artikkel);

Vi kan også slette den ved id når det er kjent:

articleRepository.deleteById ("article_id");

Det er også mulig å lage tilpassede deleteBy spørsmål og gjøre bruk av massefjerningsfunksjonen som tilbys av Elasticsearch:

articleRepository.deleteByTitle ("tittel");

7. Konklusjon

I denne opplæringen undersøkte vi hvordan du kobler til og bruker Spring Data Elasticsearch. Vi diskuterte hvordan vi kan spørre, oppdatere og slette dokumenter. Videre diskuterte vi også hvordan du lager tilpassede spørsmål, og de passer ikke til det som tilbys av Spring Data Elasticsearch.

Som vanlig kan kildekoden som brukes i denne opplæringen, bli funnet på GitHub.


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