Introduktion til Spring Data Elasticsearch

1. Oversigt

I denne vejledning vi udforsker det grundlæggende i Spring Data Elasticsearch på en kodefokuseret og praktisk måde.

Vi viser, hvordan man indekserer, søger og forespørger om Elasticsearch i en Spring-applikation ved hjælp af Spring Data Elasticsearch. Spring Data Elasticseach er et Spring-modul, der implementerer Spring Data og dermed giver en måde at interagere med den populære open source, Lucene-baserede søgemaskine.

Selvom Elasticsearch kan fungere uden noget næppe defineret skema, er det en almindelig praksis at designe en og oprette tilknytninger, der specificerer den type data, der kan forventes i visse felter. Når et dokument indekseres, behandles dets felter efter deres typer. For eksempel tokeniseres et tekstfelt og filtreres efter kortlægningsregler. Vi kunne også oprette filtre og vores egne tokenizers.

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

2. Forårsdata

Spring Data hjælper med at undgå kedelpladekode. For eksempel, hvis vi definerer et lagerinterface, der udvider ElasticsearchRepository interface leveret af Spring Data Elasticsearch, CRUD-operationer for den tilsvarende dokumentklasse gøres tilgængelige som standard.

Derudover genereres metodeimplementeringer for os ganske enkelt ved at erklære metoder med navne i et foruddefineret format - der er ikke behov for at skrive en implementering af lagergrænsefladen.

Baeldung-guiderne om Spring Data giver det væsentlige for at komme i gang med emnet.

2.1. Maven afhængighed

Spring Data Elasticsearch leverer en Java API til søgemaskinen. For at bruge det skal vi tilføje en ny afhængighed af pom.xml:

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

2.2. Definition af lagringsgrænseflader

For at definere nye opbevaringssteder udvider vi en af ​​de medfølgende lagergrænseflader og erstatter de generiske typer med vores aktuelle dokument og primære nøgletyper.

Det er vigtigt at bemærke det ElasticsearchRepository strækker sig fra PagingAndSortingRepository. Dette muliggør indbygget understøttelse af paginering og sortering.

I vores eksempel bruger vi personsøgningsfunktionen i vores tilpassede søgemetoder:

offentlig grænseflade ArticleRepository udvider ElasticsearchRepository {Page findByAuthorsName (String name, Pageable pageable); @Query ("{\" bool \ ": {\" skal \ ": [{\" match \ ": {\" forfattere.navn \ ": \"? 0 \ "}}]}}") Side findByAuthorsNameUsingCustomQuery (Navn på streng, Side-side-side); }

Med findByAuthorsName metode, oplagrer proxyen en oprettelse af en implementering baseret på metodens navn. Opløsningsalgoritmen bestemmer, at den skal have adgang til forfattere ejendom, og søg derefter i navn ejendom for hver vare.

Den anden metode, findByAuthorsNameUsingCustomQuery, bruger en brugerdefineret boolsk forespørgsel, defineret ved hjælp af @Forespørgsel kommentar, som kræver nøje matchning mellem forfatterens navn og det angivne navn argument.

2.3. Java-konfiguration

Når vi konfigurerer Elasticsearch i vores Java-applikation, skal vi definere, hvordan vi opretter forbindelse til Elasticsearch-forekomsten. Til det bruger vi en RestHighLevelClient der tilbydes af Elasticsearch afhængighed:

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

Vi bruger en standard forår-aktiveret stilkommentar. @EnableElasticsearchRepositories vil få Spring Data Elasticsearch til at scanne den medfølgende pakke til Spring Data-arkiver.

For at kommunikere med vores Elasticsearch-server bruger vi en simpel RestHighLevelClient. Mens Elasticsearch leverer flere typer klienter ved hjælp af RestHighLevelClient er en god måde at fremtidssikre kommunikationen med serveren på.

Endelig oprettede vi en ElasticsearchOperations bønne til at udføre operationer på vores server. I dette tilfælde instantierer vi en ElasticsearchRestTemplate.

3. Kortlægninger

Mappings bruges til at definere et skema for vores dokumenter. Ved at definere et skema til vores dokumenter beskytter vi dem mod uønskede resultater såsom kortlægning til en type, som vi ikke ønsker.

Vores enhed er et simpelt dokument med navnet Artikel hvor er id er af typen Snor. Vi specificerer også, at sådanne dokumenter skal opbevares i et indeks med navnet blog indenfor artikel type.

@Document (indexName = "blog", type = "artikel") offentlig klasse Artikel {@Id privat streng-id; privat streng titel; @Field (type = FieldType.Nested, includeInParent = true) private listeforfattere; // standard getters og setter}

Indekser kan have flere typer. Vi kan bruge denne funktion til at implementere hierarkier.

Det forfattere felt er markeret som FieldType.Nested. Dette giver os mulighed for at definere Forfatter klasse separat, men har de enkelte forfatterforekomster indlejret i en Artikel dokument, når det er indekseret i Elasticsearch.

4. Indeksering af dokumenter

Spring Data Elasticsearch opretter generelt automatisk indekser baseret på enhederne i projektet. Vi kan dog også oprette et indeks programmatisk via klientskabelonen:

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

Derefter kan vi tilføje dokumenter til indekset:

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

5. Forespørgsel

5.1. Metode Navnbaseret forespørgsel

Når vi bruger metodebaseret forespørgsel, skriver vi metoder, der definerer den forespørgsel, vi vil udføre. Under opsætningen analyserer Spring Data metodesignaturen og opretter forespørgsler i overensstemmelse hermed:

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

Ved at ringe findByAuthorsName med en PageRequest objekt, vi får den første side med resultater (sidetal er nul-baseret), hvor den side højst indeholder 10 artikler. Sideobjektet giver også det samlede antal hits til forespørgslen sammen med andre praktiske pagineringsoplysninger.

5.2. En brugerdefineret forespørgsel

Der er et par måder at definere brugerdefinerede forespørgsler på Spring Data Elasticsearch-arkiver. En måde er at bruge @Forespørgsel kommentar, som vist i afsnit 2.2.

En anden mulighed er at bruge forespørgselsbyggeren til at oprette vores brugerdefinerede forespørgsel.

At skulle søge efter artikler, der har ordet “data”I titlen kunne vi bare oprette en NativeSearchQueryBuilder med et filter på titel:

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

6. Opdatering og sletning

For at opdatere et dokument skal vi først hente det:

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

Derefter kan vi foretage ændringer i dokumentet bare ved at redigere indholdet af objektet ved hjælp af dets vurderere:

article.setTitle ("Kom godt i gang med søgemaskiner"); articleRepository.save (artikel);

Med hensyn til sletning er der flere muligheder. Vi kan hente dokumentet og slette det ved hjælp af slet metode:

articleRepository.delete (artikel);

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

articleRepository.deleteById ("article_id");

Det er også muligt at oprette brugerdefinerede deleteBy forespørgsler og gøre brug af den bulk-sletningsfunktion, der tilbydes af Elasticsearch:

articleRepository.deleteByTitle ("titel");

7. Konklusion

I denne vejledning undersøgte vi, hvordan du opretter forbindelse til og bruger Spring Data Elasticsearch. Vi diskuterede, hvordan vi kan forespørge, opdatere og slette dokumenter. Desuden diskuterede vi også, hvordan man opretter tilpassede forespørgsler, og de passer ikke til det, der tilbydes af Spring Data Elasticsearch.

Som sædvanlig kan kildekoden, der bruges i denne tutorial, findes på GitHub.