Úvod do Spring Data Elasticsearch

1. Prehľad

V tomto návode preskúmame základy Spring Data Elasticsearch kódovo zamerané a praktické.

Ukážeme si, ako indexovať, vyhľadávať a dopytovať Elasticsearch v jarnej aplikácii pomocou Spring Data Elasticsearch. Spring Data Elasticseach je modul Spring, ktorý implementuje Spring Data, a ponúka tak spôsob interakcie s populárnym open-source vyhľadávačom založeným na Lucene.

Aj keď Elasticsearch dokáže pracovať s ťažko definovanou schémou, je bežnou praxou navrhnúť ju a vytvoriť mapovania určujúce typ údajov, ktoré sa majú v určitých poliach očakávať.. Keď je dokument indexovaný, jeho polia sa spracúvajú podľa ich typov. Napríklad textové pole bude tokenizované a filtrované podľa pravidiel mapovania. Mohli by sme tiež vytvoriť vlastné filtre a tokenizátory.

Kvôli jednoduchosti však pre našu inštanciu Elasticsearch použijeme ukotviteľný obrázok urobí akákoľvek inštancia Elasticsearch, ktorá počúva na porte 9200.

Začneme spustením našej inštancie Elasticsearch:

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

2. Údaje o jari

Spring Data pomáha vyhnúť sa štandardnému kódu. Napríklad, ak definujeme rozhranie úložiska, ktoré rozširuje ElasticsearchRepository rozhranie poskytované Spring Data Elasticsearch, Operácie CRUD pre príslušnú triedu dokumentov budú štandardne sprístupnené.

Ďalej, jednoduchým vyhlásením metód s názvami v preddefinovanom formáte sa nám vygenerujú implementácie metód - nie je potrebné písať implementáciu rozhrania úložiska.

Baeldungskí sprievodcovia jarnými údajmi poskytujú základné informácie, aby ste mohli začať s touto témou.

2.1. Maven závislosť

Spring Data Elasticsearch poskytuje rozhranie Java API pre vyhľadávač. Aby sme ho mohli použiť, musíme do súboru pridať novú závislosť pom.xml:

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

2.2. Definovanie rozhraní úložiska

Aby sme mohli definovať nové úložiská, rozšírili sme jedno z poskytovaných rozhraní úložiska a nahradili sme všeobecné typy našimi skutočnými typmi dokumentov a primárnych kľúčov.

Je dôležité si to uvedomiť ElasticsearchRepository siaha od PagingAndSortingRepository. To umožňuje zabudovanú podporu stránkovania a triedenia.

V našom príklade použijeme funkciu stránkovania v našich vlastných metódach vyhľadávania:

verejné rozhranie ArticleRepository rozširuje ElasticsearchRepository {Page findByAuthorsName (názov reťazca, stránkovateľné stránkovateľné); @Query ("{\" bool \ ": {\" musí \ ": [{\" zápas \ ": {\" autori.name \ ": \"? 0 \ "}}]}}")) stránka findByAuthorsNameUsingCustomQuery (Názov reťazca, stránkovateľné stránkovateľné); }

Vďaka findByAuthorsName metóda, úložisko proxy vytvorí implementáciu na základe názvu metódy. Algoritmus rozlíšenia určí, že musí mať prístup k autorov nehnuteľnosť a potom prehľadať názov majetku každej položky.

Druhá metóda, findByAuthorsNameUsingCustomQuery, používa vlastný boolovský dotaz Elasticsearch, definovaný pomocou @Dopyt anotácia, ktorá vyžaduje prísne porovnanie medzi menom autora a poskytnutým textom názov argument.

2.3. Konfigurácia Java

Pri konfigurácii Elasticsearch v našej aplikácii Java musíme definovať, ako sa pripájame k inštancii Elasticsearch. Na to používame a RestHighLevelClient ktoré ponúka závislosť Elasticsearch:

@Configuration @EnableElasticsearchRepositories (basePackages = "com.baeldung.spring.data.es.repository") @ComponentScan (basePackages = {"com.baeldung.spring.data.es.service"}) verejná trieda Konfigurácia {@Bean public RestHighLevelClient client () {ClientConfiguration clientConfiguration = ClientConfiguration.builder () .connectedTo ("localhost: 9200") .build (); vrátiť RestClients.create (clientConfiguration) .rest (); } @Bean public ElasticsearchOperations elasticsearchTemplate () {vrátiť nový ElasticsearchRestTemplate (client ()); }}

Používame štandardnú anotáciu štýlu Spring. @EnableElasticsearchRepositories urobí Spring Data Elasticsearch skenovanie poskytnutého balíka pre úložiská Spring Data.

Na komunikáciu s našim serverom Elasticsearch používame jednoduchý RestHighLevelClient. Zatiaľ čo Elasticsearch poskytuje viac typov klientov, pomocou RestHighLevelClient je dobrý spôsob ako zabezpečiť komunikáciu so serverom do budúcnosti.

Nakoniec sme založili ElasticsearchOperations bean vykonávať operácie na našom serveri. V tomto prípade vytvoríme inštanciu ElasticsearchRestTemplate.

3. Mapovania

Mapovania sa používajú na definovanie schémy pre naše dokumenty. Definovaním schémy pre naše dokumenty ich chránime pred nežiaducimi výsledkami, ako je napríklad mapovanie na typ, ktorý by sme nechceli.

Naša entita je jednoduchý dokument s názvom Článok kde id je typu String. Tiež špecifikujeme, že takéto dokumenty musia byť uložené v indexe s názvom blog v rámci článok typu.

@Document (indexName = "blog", type = "článok") verejná trieda článok {@Id súkromné ​​ID reťazca; súkromný názov reťazca; @ Pole (typ = FieldType.Nested, includeInParent = true) súkromní autori zoznamu; // štandardné getre a setre}

Indexy môžu mať niekoľko typov. Túto funkciu môžeme použiť na implementáciu hierarchií.

The autorov pole je označené ako FieldType.Vnorené. To nám umožňuje definovať Autor triedy osobitne, ale majú jednotlivé inštancie autora vložené do súboru Článok dokument, keď je indexovaný v Elasticsearch.

4. Indexovanie dokumentov

Spring Data Elasticsearch všeobecne automaticky vytvára indexy na základe entít v projekte. Index však môžeme vytvoriť aj programovo prostredníctvom šablóny klienta:

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

Potom môžeme do indexu pridať dokumenty:

Článok článku = nový článok ("Spring Data Elasticsearch"); article.setAuthors (asList (nový autor („John Smith“), nový autor („John Doe“)))); articleRepository.save (článok);

5. Dopytovanie

5.1. Metóda Na základe názvu

Keď používame dotaz založený na názve metódy, napíšeme metódy, ktoré definujú dotaz, ktorý chceme vykonať. Počas nastavenia Spring Data analyzuje podpis metódy a podľa toho vytvorí dotazy:

Názov reťazcaToFind = "John Smith"; Stránka articleByAuthorName = articleRepository.findByAuthorsName (nameToFind, PageRequest.of (0, 10));

Volaním findByAuthorsName s PageRequest objekt, získame prvú stránku s výsledkami (číslovanie stránok je nulové), pričom táto stránka obsahuje najviac 10 článkov. Objekt stránky tiež poskytuje celkový počet prístupov k dotazu spolu s ďalšími užitočnými informáciami o stránkovaní.

5.2. Vlastný dopyt

Existuje niekoľko spôsobov, ako definovať vlastné dotazy pre archívy Spring Data Elasticsearch. Jedným zo spôsobov je použitie @Dopyt anotácie, ako je uvedené v časti 2.2.

Ďalšou možnosťou je použiť nástroj na tvorbu dotazov na vytvorenie nášho vlastného dotazu.

Musíte hľadať články, ktoré majú slovo „údaje”V názve by sme mohli jednoducho vytvoriť a NativeSearchQueryBuilder s filtrom na nadpis:

Dotaz searchQuery = nový NativeSearchQueryBuilder () .withFilter (regexpQuery ("title", ". * Data. *")) .Build (); SearchHits articles = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("blog");

6. Aktualizácia a odstránenie

Aby sme mohli dokument aktualizovať, musíme ho najskôr získať:

Reťazec articleTitle = "Spring Data Elasticsearch"; Dotaz searchQuery = nový NativeSearchQueryBuilder () .withQuery (matchQuery ("title", articleTitle) .minimumShouldMatch ("75%")) .build (); SearchHits articles = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("blog"); Article article = articles.getSearchHit (0) .getContent ();

Potom môžeme vykonať zmeny v dokumente iba úpravou obsahu objektu pomocou jeho hodnotiteľov:

article.setTitle ("Začíname s vyhľadávačmi"); articleRepository.save (článok);

Pokiaľ ide o vymazanie, existuje niekoľko možností. Dokument môžeme získať a odstrániť pomocou servera vymazať metóda:

articleRepository.delete (článok);

Môžeme ho tiež odstrániť pomocou id keď je známe:

articleRepository.deleteById ("article_id");

Je tiež možné vytvoriť vlastné deleteBy dotazy a využiť funkciu hromadného mazania, ktorú ponúka Elasticsearch:

articleRepository.deleteByTitle ("názov");

7. Záver

V tomto tutoriáli sme skúmali, ako sa spojiť a využiť Spring Data Elasticsearch. Diskutovali sme o tom, ako môžeme dopytovať, aktualizovať a mazať dokumenty. Okrem toho sme tiež diskutovali o tom, ako vytvoriť vlastné dotazy, ktoré nezodpovedajú tomu, čo ponúka Spring Data Elasticsearch.

Ako obvykle, zdrojový kód použitý v tomto tutoriále nájdete na GitHub.