Elasticsearch dotazy s jarnými dátami

1. Úvod

V predchádzajúcom článku sme si ukázali, ako nakonfigurovať a použiť Spring Data Elasticsearch pre projekt. V tomto článku preskúmame niekoľko typov dotazov ponúkaných službou Elasticsearch a povieme si tiež o poľných analyzátoroch a ich vplyve na výsledky vyhľadávania.

2. Analyzátory

Všetky uložené polia reťazca sú štandardne spracované analyzátorom. Analyzátor sa skladá z jedného tokenizátora a niekoľkých filtrov tokenov a obvykle mu predchádza jeden alebo viac filtrov znakov.

Predvolený analyzátor rozdelí reťazec na bežné oddeľovače slov (ako sú medzery alebo interpunkčné znamienka) a všetky tokeny vkladá malými písmenami. Ignoruje tiež bežné anglické slová.

Elasticsearch možno tiež nakonfigurovať tak, aby považoval pole za analyzované a neanalyzované súčasne.

Napríklad v Článok triedy, predpokladajme, že pole s nadpisom uložíme ako štandardné analyzované pole. To isté pole s príponou doslovne sa uloží ako neanalyzované pole:

@MultiField (mainField = @Field (typ = text, fielddata = true), otherFields = {@InnerField (prípona = "verbatim", typ = kľúčové slovo)})) názov súkromného reťazca;

Tu aplikujeme @MultiField anotácia, ktorá hovorí spoločnosti Spring Data, že by sme chceli, aby bolo toto pole indexované niekoľkými spôsobmi. Hlavné pole bude používať názov titul a budú analyzované podľa pravidiel opísaných vyššie.

Poskytujeme však aj druhú anotáciu, @InnerField, ktorý popisuje ďalšie indexovanie indexu titul lúka. Používame FieldType.keyword aby sme naznačili, že pri dodatočnej indexácii poľa nechceme používať analyzátor a že by sa táto hodnota mala ukladať pomocou vnoreného poľa s príponou doslovne.

2.1. Analyzované polia

Pozrime sa na príklad. Dajme tomu, že do nášho indexu bude pridaný článok s názvom „Spring Data Elasticsearch“. Predvolený analyzátor rozdelí reťazec na medzery a vytvorí malé tokeny: „jar“, “údaje “, a „elasticsearch“.

Teraz môžeme na priradenie dokumentu použiť ľubovoľnú kombináciu týchto výrazov:

NativeSearchQuery searchQuery = nový NativeSearchQueryBuilder () .withQuery (matchQuery ("title", "elasticsearch data")) .build ();

2.2. Neanalyzované polia

Neinalyzované pole nie je tokenizované, takže ho možno zhodovať ako celok iba pri použití zhody alebo dotazu na výraz:

NativeSearchQuery searchQuery = nový NativeSearchQueryBuilder () .withQuery (matchQuery ("title.verbatim", "Druhý článok o Elasticsearch")) .build ();

Pomocou dotazu na zhodu môžeme vyhľadávať iba podľa celého názvu, ktorý tiež rozlišuje veľké a malé písmená.

3. Dotaz na zhodu

A zhoda dotazu prijíma text, čísla a dátumy.

Existujú tri typy hľadaných výrazov:

  • boolovský
  • fráza a
  • frázová predpona

V tejto časti preskúmame boolovský zhoda dotazu.

3.1. Zhoda s boolovskými operátormi

boolovský je predvolený typ dotazu na zhodu; môžete určiť, ktorý boolovský operátor sa má použiť (alebo je predvolené nastavenie):

NativeSearchQuery searchQuery = nový NativeSearchQueryBuilder () .withQuery (matchQuery ("title", "Vyhľadávače"). Operator (Operator.AND)) .build (); SearchHits articles = elasticsearchTemplate () .search (searchQuery, Article.class, IndexCoordinates.of ("blog"));

Tento dopyt vráti článok s názvom „Vyhľadávače“ zadaním dvoch výrazov z názvu s a operátor. Čo sa však stane, ak budeme hľadať s predvoleným nastavením (alebo) operátor, keď sa zhoduje iba jeden z výrazov?

NativeSearchQuery searchQuery = nový NativeSearchQueryBuilder () .withQuery (matchQuery ("title", "Engines Solutions")) .build (); SearchHits articles = elasticsearchTemplate () .search (searchQuery, Article.class, IndexCoordinates.of ("blog")); assertEquals (1, articles.getTotalHits ()); assertEquals ("Vyhľadávače", articles.getSearchHit (0) .getContent (). getTitle ());

Vyhľadávače„Článok je stále priradený, ale bude mať nižšie skóre, pretože sa nezhodujú všetky výrazy.

Súčet skóre každého zodpovedajúceho výrazu sa sčítava s celkovým skóre každého výsledného dokumentu.

Môžu sa vyskytnúť situácie, v ktorých bude mať dokument obsahujúci zriedkavý výraz zadaný do dotazu vyššiu pozíciu ako dokument, ktorý obsahuje niekoľko bežných výrazov.

3.2. Fuzziness

Keď používateľ urobí preklep v slove, stále je možné ho spojiť s vyhľadávaním zadaním a neostrosť parameter, ktorý umožňuje nepresnú zhodu.

Pre polia reťazcov neostrosť znamená vzdialenosť úprav: počet jednoznakových zmien, ktoré je potrebné vykonať v jednom reťazci, aby bol rovnaký ako v inom reťazci.

NativeSearchQuery searchQuery = nový NativeSearchQueryBuilder () .withQuery (matchQuery ("názov", "jarné elastické vyhľadávanie") .operator (Operator.AND) .fuzziness (Fuzziness.ONE) .prefixLength (3)) .build ();

The prefix_length parameter sa používa na zlepšenie výkonu. V takom prípade vyžadujeme, aby sa prvé tri znaky presne zhodovali, čo znižuje počet možných kombinácií.

5. Vyhľadávanie fráz

Fázové vyhľadávanie je prísnejšie, aj keď ho môžete ovládať pomocou odfláknuť parameter. Tento parameter hovorí frázovému dotazu, ako ďaleko môžu byť pojmy od seba, zatiaľ čo sa dokument považuje za zhodu.

Inými slovami predstavuje, koľkokrát je potrebné presunúť výraz, aby sa dopyt a dokument zhodovali:

NativeSearchQuery searchQuery = nový NativeSearchQueryBuilder () .withQuery (matchPhraseQuery ("názov", "pružný elastický prehľad"). Slop (1)) .build ();

Tu bude dopyt zodpovedať dokumentu s nadpisom „Jarný prehľad dát”, Pretože sme nastavili slop na jednu.

6. Dotaz na viac zhody

Ak chcete vyhľadávať vo viacerých poliach, mohli by ste použiť QueryBuilders # multiMatchQuery () kde zadáte všetky zodpovedajúce polia:

NativeSearchQuery searchQuery = nový NativeSearchQueryBuilder () .withQuery (multiMatchQuery ("návod") .field ("title") .field ("tagy"). Typ (MultiMatchQueryBuilder.Type.BEST_FIELDS)) .build ();

Tu hľadáme titul a značky polia na zápas.

Všimnite si, že tu používame stratégiu bodovania „najlepších polí“. Maximálne skóre medzi poliami bude vyhodnotené ako skóre dokumentu.

7. Agregácie

V našom Článok triedy sme definovali aj a značky pole, ktoré nie je analyzované. Cloud značiek by sme mohli ľahko vytvoriť pomocou agregácie.

Pamätajte, že pretože pole nie je analyzované, značky nebudú tokenizované:

TermsAggregationBuilder aggregation = AggregationBuilders.terms ("top_tags") .field ("tagy") .order (Terms.Order.count (false)); Builder SearchSourceBuilder = nový SearchSourceBuilder (). Agregácia (agregácia); SearchRequest searchRequest = nový SearchRequest (). Indexy ("blog"). Typy ("článok"). Zdroj (staviteľ); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT); Výsledky mapy = response.getAggregations (). AsMap (); StringTerms topTags = (StringTerms) results.get ("top_tags"); Zoznam kľúčov = topTags.getBuckets () .stream () .map (b -> b.getKeyAsString ()) .collect (toList ()); assertEquals (asList ("elasticsearch", "jarné údaje", "vyhľadávače", "výukový program"), kľúče);

8. Zhrnutie

V tomto článku sme diskutovali o rozdieloch medzi analyzovanými a neanalyzovanými poľami a o tom, ako tento rozdiel ovplyvňuje vyhľadávanie.

Dozvedeli sme sa tiež o niekoľkých druhoch dotazov poskytovaných serverom Elasticsearch, ako sú napríklad zhoda dotazu, frázová zhoda dotazu, fulltextový vyhľadávací dotaz a booleovský dotaz.

Elasticsearch poskytuje mnoho ďalších typov dotazov, ako sú napríklad geografické dotazy, dotazy na skripty a zložené dotazy. Môžete si o nich prečítať v dokumentácii Elasticsearch a preskúmať API Spring Data Elasticsearch, aby ste tieto dotazy mohli použiť vo svojom kóde.

Projekt obsahujúci príklady použité v tomto článku nájdete v úložisku GitHub.


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