09 - Textová analýza

 

Při ukládání dat do Elasticsearch probíhá na polích typu text textová analýza. Během analýzy Elasticsearch rozdělí text na slova (tokeny), převede je do základní formy (například převede množné číslo na jednotné) a uloží je do speciální datové struktury zvané invertovaný index.

 

Standard analyzer

Výchozí analyzér se jmenuje standard. S jeho pomocí je možné implementovat full textové vyhledávání nezávislé na velikosti písmen. Pro kontrolu, jak bude vypadat výsledek analýzy pro daný text lze využít endpoint _analyze:

Při definici mapování lze zvolit, jaký analyzer má být pro dané pole použit. Stejný analyzér pak bude použit i pro vyhledávání.

 

Jazykové analyzéry

Přestože bude standard analyzer pro mnoho případů dostačující, při práci s přirozeným jazykem dosáhneme lepších výsledků s specifickými analyzéry pro dané jazyky, tzv. language analyzers. Pro porovnání můžeme vyzkoušet anglický analyzér (english) pro shodný vstupní text:

Jazyková analýza navíc převede:

Díky tomu je možné vyhledávat v dokumentech nezávisle na tvarosloví.

 

Custom analyzer

Pokud však ani jazyková analýza nedostačuje, je nutné vytvořit vlastní (custom) analyzer. Každý analyzér sestává z tří částí:

  1. Char filter: Filtruje vstupní text na úrovni znaků, lze využít například k odstranění HTML značek
  2. Tokenizer: Dělí vstupní text na tokeny
  3. Token filter: Modifikuje token (například je převádí na malá písmena, nebo do základního tvaru), odstraňuje nepotřebné tokeny (stopslova) nebo přidává další tokeny (synonyma)

Custom analyzer lze definovat v rámci nastavení indexu:

jakmile je index vytvořen, lze otestovat textovou analýzu:

Nejpoužívanější filtry jsou:

Character filter

Tokenizer

Token filter

 

Custom analyzer: příklad českého analyzéru

Při vytváření českého analyzéru je třeba vzít v úvahu:

Alternativou k algoritmickému stemmeru může být slovníkový, který je v případě Elasticsearch reprezentován hunspell token filtrem. Jakmile přidáte slovníky do konfigurační složky Elasticsearch, můžete nadefinovat v rámci analýzy vlastní filtr:

 

Částečná shoda, překlepy

Uživatelský vstup často obsahuje chyby ve formě překlepů. Vypořádat se s nimi je možné:

  1. V době dotazu

    1. match query s argumentem fuzziness (pro pole typu text)
    2. fuzzy query (pro pole typu keyword)
  2. Při indexování dat

    1. ngram tokenizer

Při hledání s překlepy dávejte pozor na výkonnost. Fuzzy query může vyhledávání znatelně zpomalit. Na druhé straně při použití n-gramů dochází k nárůstu velikosti indexů.

Alternativou k n-gramům může být suggester (docs). Nabízí rychlé vyhledávání za cenu vyššího využití paměti. Dále není tak konfigurovatelný.

 

Našeptávač

Situace je obdobná jako v předchozím případě s jediným rozdílem: Přesně víme, že hledáme od začátku slova. Opět máme k dispozici obdobné přístupy:

  1. V době dotazu

    1. match_phrase_prefix query pro pole typu text
    2. prefix query pro pole typu keyword
  2. Při indexování dat

    1. edge_ngram tokenizer
    2. search_as_you_type datový typ:

 

Úkol: custom analyzer

  1. Připravte nastavení indexu pro nový index nazvaný my_em_analyzer — zkopírujte nastavení anglického analyzéru z https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#english-analyzer

  2. Rozšiřte analyzér:

    1. Přidejte character filter, který odstraní HTML značky z vstupního textu
    2. Přidejte custom synonym filter, který převede slovo failure na error
  3. Vytvořte následující mapping:

    1. Název pole: message
    2. Typ pole: text
    3. Analyzer: pole message by mělo využívat analyzer definovaný v předchozím kroku
  4. Uložte následující dokumenty do ES:

  5. Vyhledejte error v poli message. Oba dokumenty by měly být nalezeny.