Egyszerű címkézési megvalósítás az Elasticsearch segítségével

Kitartás felső

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT Ez a cikk egy sorozat része: • Egyszerű címkézési megvalósítás az Elasticsearch segítségével (aktuális cikk) • Egyszerű címkézési megvalósítás a JPA-val

• Fejlett címkézési megvalósítás a JPA-val

• Egyszerű címkézési megvalósítás a MongoDB-vel

1. Áttekintés

A címkézés egy általános tervezési minta, amely lehetővé teszi számunkra az adatmodellünk tételeinek kategorizálását és szűrését.

Ebben a cikkben a címkézést a Spring és az Elasticsearch segítségével valósítjuk meg. Mind a Spring Data-t, mind az Elasticsearch API-t fogjuk használni.

Először is nem foglalkozunk az Elasticsearch és a Spring Data megszerzésének alapjaival - ezeket itt megismerheti.

2. Címkék hozzáadása

A címkézés legegyszerűbb megvalósítása a stringek tömbje. Ezt úgy tudjuk megvalósítani, hogy egy új mezőt adunk hozzá az adatmodellünkhöz:

@Document (indexName = "blog", type = "cikk") public class Article {// ... @Field (type = Keyword) private String [] tagek; // ...}

Figyelje meg a Kulcsszó mező típusa. Csak azt szeretnénk, ha címkéink pontos egyezései szűrnék az eredményt. Ez lehetővé teszi számunkra, hogy hasonló, de különálló címkéket, például elasticsearchIsAwesome és elasticsearchIsTerrible.

Az elemzett mezők részleges találatokat adnának vissza, ami ebben az esetben helytelen viselkedés.

3. Építési lekérdezések

A címkék lehetővé teszik számunkra, hogy érdekes módon manipuláljuk lekérdezéseinket. Kereshetünk közöttük, mint bármely más mező, vagy felhasználhatjuk őket az eredmények szűrésére match_all lekérdezések. Ezeket más lekérdezésekkel is felhasználhatjuk az eredmények szigorítására.

3.1. Címkék keresése

Az új címke a modellünkön létrehozott mező ugyanolyan, mint az indexünk minden más mezője. Bármely entitásra rákereshetünk, amely rendelkezik egy ehhez hasonló címkével:

@Query ("{\" bool \ ": {\" must \ ": [{\" match \ ": {\" tags \ ": \"? 0 \ "}}]}}}}" ") page findByTagUsingDeclaredQuery (String tag, lapozható lapozható);

Ez a példa a Spring Data Repository segítségével állítja össze a lekérdezésünket, de ugyanolyan gyorsan használhatunk egy Rest Sablont az Elasticsearch fürt manuális lekérdezéséhez.

Hasonlóképpen használhatjuk az Elasticsearch API-t is:

boolQuery (). must (termQuery ("tags", "elasticsearch"));

Tegyük fel, hogy indexünkben a következő dokumentumokat használjuk:

[{"id": 1, "title": "Spring Data Elasticsearch", "szerzők": [{"name": "John Doe"}, {"name": "John Smith"}], "tags": ["elasticsearch", "tavaszi adatok"]}, {"id": 2, "title": "Keresőmotorok", "szerzők": [{"name": "John Doe"}], "tagek": [ "keresőmotorok", "bemutató"]}, {"id": 3, "title": "Második cikk az Elasticsearchről", "szerzők": [{"name": "John Smith"}], "tags": ["elasticsearch", "tavaszi adatok"]}, {"id": 4, "title": "Elasticsearch Tutorial", "author": [{"name": "John Doe"}], "tags": [ "elasticsearch"]},]

Most használhatjuk ezt a lekérdezést:

OldalcikkByTags = articleService.findByTagUsingDeclaredQuery ("elasticsearch", PageRequest.of (0, 10)); // ArticleByTags 3 cikket fog tartalmazni [1, 3, 4] assertThat (articleByTags, tartalmazInAnyOrder (hasProperty ("id", is (1)), hasProperty ("id", (3)), hasProperty ("id", ((4))));

3.2. Az összes dokumentum szűrése

Gyakori tervezési minta a Szűrt lista nézet a felhasználói felületen, amely az összes entitást megjeleníti, de lehetővé teszi a felhasználó számára a szűrést is különböző kritériumok alapján.

Tegyük fel, hogy az összes cikket vissza akarjuk adni a felhasználó által kiválasztott címke alapján szűrve:

@Query ("{\" bool \ ": {\" must \ ":" + "{\" match_all \ ": {}}, \" filter \ ": {\" term \ ": {\" tags \ ": \"? 0 \ "}}}}" ") Page findByFilteredTagQuery (String tag, Lapozható lapozható);

Ismét a Spring Data-t használjuk a deklarált lekérdezés összeállításához.

Következésképpen az általunk használt lekérdezés két részre oszlik. A pontozási lekérdezés az első kifejezés, ebben az esetben match_all. A szűrőkérdezés következik, és megmondja az Elasticsearchnek, hogy mely eredményeket kell elvetni.

Így használjuk ezt a lekérdezést:

OldalcikkByTags = articleService.findByFilteredTagQuery ("elasticsearch", PageRequest.of (0, 10)); // A articleByTags 3 cikket fog tartalmazni [1, 3, 4] assertThat (articleByTags, tartalmazInAnyOrder (hasProperty ("id", (1)), hasProperty ("id", (3)), hasProperty ("id", ((4))));

Fontos felismerni, hogy bár ez ugyanazokat az eredményeket adja, mint a fenti példánk, ez a lekérdezés jobban fog teljesíteni.

3.3. Lekérdezések szűrése

Néha egy keresés túl sok eredményt ad vissza ahhoz, hogy használható legyen. Ebben az esetben jó, ha kiszűrünk egy szűrési mechanizmust, amely újra lefuttathatja ugyanazt a keresést, csak az eredmények szűkítésével.

Íme egy példa arra, hogy szűkítjük a szerző által írt cikkeket, csak azokra, amelyek egy adott címkével rendelkeznek:

@Query ("{\" bool \ ": {\" must \ ":" + "{\" match \ ": {\" author.name \ ": \"? 0 \ "}}," + "\ "filter \": {\ "term \": {\ "tags \": \ "? 1 \"}}}} ") Page findByAuthorsNameAndFilteredTagQuery (karakterlánc neve, String címke, lapozható lapozható);

A Spring Data megint minden munkát elvégez helyettünk.

Vizsgáljuk meg azt is, hogyan állítsuk össze magunknak ezt a lekérdezést:

QueryBuilder builder = boolQuery (). Must (nestedQuery ("szerzők", boolQuery (). Must (termQuery ("szerzők neve", "őzek")), ScoreMode.None)). Szűrő (termQuery ("címkék", "") rugalmas keresés "));

Természetesen ugyanezt a technikát használhatjuk a dokumentum bármely más mezőjének szűrésére. De a címkék különösen jól alkalmazzák ezt a felhasználási esetet.

Így használhatja a fenti lekérdezést:

SearchQuery searchQuery = new NativeSearchQueryBuilder (). WithQuery (builder) .build (); Cikklista = elasticsearchTemplate.queryForList (searchQuery, Article.class); // a cikkek tartalmaznak [1, 4] assertThat (articleByTags, tartalmazInAnyOrder (hasProperty ("id", az (1)), hasProperty ("id", az (4))));

4. Szűrje a kontextust

Amikor létrehozunk egy lekérdezést, meg kell különböztetnünk a Lekérdezés és a Szűrés kontextust. Az Elasticsearch minden lekérdezésének van egy lekérdezési környezete, ezért hozzá kell szoknunk látni őket.

Nem minden típusú lekérdezés támogatja a szűrőkörnyezetet. Ezért, ha szűrni akarunk a címkéken, tudnunk kell, hogy melyik lekérdezési típusokat használhatjuk.

A bool A lekérdezésnek két módja van a Szűrőkörnyezet elérésére. Az első paraméter, szűrő, amelyet fentebb használunk. Használhatjuk a tilos paraméter a kontextus aktiválásához.

A következő lekérdezési típus, amelyet szűrni tudunk konstans_pontszám. Ez akkor hasznos, ha uu akarja cserélni a Lekérdezés kontextust a Szűrő eredményeivel, és minden eredményhez ugyanazt a pontszámot rendelni.

Az utolsó lekérdezési típus, amelyet címkék alapján szűrhetünk, a szűrő összesítése. Ez lehetővé teszi számunkra, hogy a szűrőnk eredményei alapján összesítő csoportokat hozzunk létre. Más szavakkal, összes cikket címkék szerint csoportosíthatunk összesítési eredményünkben.

5. Speciális címkézés

Eddig csak a legalapvetőbb megvalósítású címkézésről beszéltünk. A következő logikus lépés olyan címkék létrehozása, amelyek önmaguk kulcs-érték párok. Ez lehetővé tenné számunkra, hogy még jobban kedveljük a kérdéseinket és a szűrőinket.

Például megváltoztathatnánk a címke mezőnket erre:

@Field (type = Beágyazott) privát lista címkék;

Akkor csak cserélnénk a szűrőket a használatra nestedQuery típusok.

Miután megértettük, hogyan kell használni kulcs-érték párok ez egy kis lépés ahhoz, hogy összetett objektumokat használjunk címkénkként. Nem sok megvalósításhoz lesz szükség teljes objektumra címkeként, de jó tudni, hogy van ilyen lehetőségünk, ha szükségünk lenne rá.

6. Következtetés

Ebben a cikkben a címkézés Elasticsearch használatával történő megvalósításának alapjait ismertettük.

Mint mindig, a GitHubon is találhatunk példákat.

Következő » Egyszerű címkézési megvalósítás a JPA-perzisztencia alján

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT