web.php5.sk

Elasticsearch - mapping VII

24. apríl 2020 / Čamo

Tak si to zhrňme. Mapujeme nový index a definujeme analyzátory. Každý analyzátor sa skladá z troch základných kameňov. Char filtrov, Tokenexception, exclusionizerov a Token filtrov. Prvé dve skupiny sú za nami. Takže na rade sú Token filtre.

Token Filtre

Token filtre prímajú tokeny z tokenizera a modifikujú tokeny (lowercase), mažú tokeny (stopwords) alebo pridávajú tokeny (synonyms).

Elasticsearch má množstvo preddefinovaných token filtrov. Takže si ich po jednom rozoberieme.

 

Standard Token Filter

Aktuánlne nerobí nič. 6.8 https://www.elastic.co/guide/en/elasticsearch/reference/6.8/analysis-standard-tokenfilter.html Kiež by boli všetky také stručné ako tento filter.

 

ASCII Folding Token Filter

Konvertuje písmená, čísla a unicode znaky, ktoré nie sú medzi prvými 127 ASCII znakmi (Basic Latin) na ich ASCII ekvivalent ak existuje. 

Príklad:

PUT /asciifold_example
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "default" : {
                    "tokenizer" : "standard",
                    "filter" : ["asciifolding"]
                }
            }
        }
    }
}

Parametre:

  • preserve_original: Veľmi zaujímavá voľba. Default je FALSE. Ak je TRUE tak indexuje aj originálny token aj upravený token. Teda ak indexujete slovo čevapčiči tak sa uloží indexuje aj čevapčiči aj cevapcici. 
PUT /asciifold_example
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "default" : {
                    "tokenizer" : "standard",
                    "filter" : ["my_ascii_folding"]
                }
            },
            "filter" : {
                "my_ascii_folding" : {
                    "type" : "asciifolding",
                    "preserve_original" : true
                }
            }
        }
    }
}

 

Flatten Graph Token Filter

Filter flatten_graph token filter spracováva ľubovoľný graph token stream to je niečo takéto a vytvorí z neho jedenu lineárnu reťaz tokenov vhodnú pre indexovanie. to spôsobí učitú stratu údajov v zmysle napr. "pozicovania" tokenov, ale je to nevyhnutné pretože Lucene nevie prezentovať graph tokeny. Z týchto dôvodov je lepšie aplikovať graph analyzery len počas search time, pretože zachová graph štruktúru a korektne zachytáva proxymity queries. :D

This is a lossy process, as separate side paths are squashed on top of one another, but it is necessary if you use a graph token stream during indexing because a Lucene index cannot currently represent a graph. For this reason, it’s best to apply graph analyzers only at search time because that preserves the full graph structure and gives correct matches for proximity queries.

 

Length Token Filter

length filter odstráni slová, ktoré sú moc dlhé alebo príliš krátne. 

Parametre

  • min: Minimálna dlžka. Default 0.
  • max: Maximálna dlžka. Default Integer.MAX_VALUE, which is 2^31-1 or 2147483647
 

Lowercase Token Filter

lowercase token filter prevedie tokeny na malé písmená.

Filter podporuje podskupinu grécke, írske a turecké lowercase token filtre cez parameter language.

Parametre

  • language: Podporuje grécku, írsku a tureckú podskupinu filtra. Povolené hodnoty sú teda greek_lowercase, irish_lowercase, turkish_lowercase.

Príklad gréckeho lowercase filtra.

PUT /lowercase_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_lowercase_example": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase"]
        },
        "greek_lowercase_example": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["greek_lowercase"]
        }
      },
      "filter": {
        "greek_lowercase": {
          "type": "lowercase",
          "language": "greek"
        }
      }
    }
  }
}
 
 

Uppercase Token Filter

uppercase prevedie tokeny na veľké písmená.

 

NGram Token Filter

ngram filter vytvorí z tokenov ngrm tokeny. Napr. z tokenu fox vytvorí default tokeny: f, fo, o, ox, x

Parametre:

  • min_gram: Minimálna dlžka tokenu. Default je 1
  • max_gram: Max. dlžka tokenu. Default je 2
 

Na úrovni indexu je možné nastaviť index.max_ngram_diff ktorý kontroluje maximálny rozsah medzi min_gram a max_gram hodnotou.

PUT ngram_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_ngram": {
          "tokenizer": "standard",
          "filter": [ "my_ngram" ]
        }
      },
"filter": {
my_ngram: {
type: ngram,
min_gram: 1,
max?gram: 10
}
} } } }

 

Edge NGram Token Filter

Pracuje podobne ako ngram token filter ale začiatok tokenov nevytvára posúvaním sa po slove ale je naviazaný na začiatok slova. Používa sa pri implenetácii search-as-you-type vyhľadávania. Tokeny quick a fox rozdelí do tokenov: q, qu, f, fo

Parametre

  • min_gram: Minimálna dlžka tokenu. Default je 1
  • max_gram: Max. dlžka tokenu. Default je 2
  • side: Deprecated. Default je front a druhá možnosť je back. Určije z ktorej strany sa bude tokenizovať. Miesto tejto voľby je lepšie použiť pred a po volaní edge_ngram filra reverse filter, ktrorý tokeny pred tým revertne a potom vráti spať.
PUT edge_ngram_custom_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "whitespace",
          "filter": [ "3_5_edgegrams" ]
        }
      },
      "filter": {
        "3_5_edgegrams": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 5
        }
      }
    }
  }
}

Hodnota max_gram limituje dlžku tokenov. Keď sa edge_ngram použije s index analyzerom zaindexujú sa iba tokeny danej dlžky. To spôsobí, že hľadané výrazy, ktroé sú dlhšie vrátia prázdny výsledok. Nar. ak je max 3 a máme token app tak výraz apple nič nevráti. To sa dá obísť tým že sa počas search time použije truncate filter, ktroý výraz skráti na max_gram dlžku. To ale môže vracať irelevantné výsledky. 

 

Porter Stem Token Filter

Filter porter_stem aplikuje na tokeny Porter stemming algoritmus. 

Input do stemming filtra musí byť pred tým prevedný na lowercase, takže pred tým treba zavolať buď lowercase token filter alebo lowercase tokenizer. 

 

Shingle Token Filter

Pospája tokeny ako kombinácie viacerých (default 2) tokenov do jedného tokenu.  Napríklad vetu "please divide this sentence into shingles" prevedien na tokeny "please divide", "divide this", "this sentence", "sentence into", and "into shingles".

Parametre

  • max_shingle_size: Maximálny počet tokenov, ktroé sa spoja. Default 2.
  • min_shingle_size: Minimálny počet tokenov, ktroé sa spoja. Default 1.
  • output_unigrams: If je TRUE output bude obsahvať input tokeny (unigrams) spolu so shingles tokenmi. Default TRUE.
  • output_unigrams_if_no_shingles: Ak output_unigrams (ano predošlý filter) je FALSE output bude obsahovať originálne tokeny. Ake je TRUE tak output_unigrams_if_no_shingles nemá žiadny efekt. Default je FALSE
  • token_separator: String ktroý sa použije na spájanie tokenov. Default je medzera.
  • fillter_token: String ktroý sa použije ako náhrada keď veď si to prečítajte sami: The string to use as a replacement for each position at which there is no actual token in the stream. For instance this string is used if the position increment is greater than one when a stop filter is used together with the shingle filter. Defaults to "_"

Na úrovni indexu je možné nastaviť index.max_shingle_diff, ktrorý kontroluje maximálny rozsah medzi max_shingle_size a min_shingle_size

 

Stop Token Filter

Odstráni stopwords spomedzi tokenov. Defaultne odstráni nasledujúce anglické stopwords: a, an, and, are, as, at, be, but, buy, for, if, in, into, is, it, no, not, of, on, or, such, that, the, their, then, there, these, they, this, to, was, will, with.

Elasticsearch obsahuje niekoľko preddefinovaných stopwords zoznamov pre niektoré jazyky stop word lists for several languages. Slovenčina medzi nimi nieje. Je možné nastaviť vlastné stopwords ako súbor UTF-8 alebo ako pole. 

Príklad

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "whitespace",
          "filter": [ "my_stop_words_filter" ]
        }
      },
      "filter": {
        "my_stop_words_filter": {
          "type": "stop",
          "ignore_case": true,
          "stopwords": [ "a", "i", "alebo" ]
        }
      }
    }
  }
}

GET /_analyze
{
"analyzer": "default",
"text": "jablká A hrušky I slivky, aLEbo mango"
}

Predošlý request vygeneruje tokeny: jablká, hrušky, slivky, mango. 
Všetky spojky boli z tokenov odstránené.

Parametre:

  • stopwords: Pole slov, alebo názov preddefinovanovaného zoznamu napr. _english_. Default _english_
  • stopwords_path: Cesta (relatívna ku config adresáru, alebo absolútna) k UTF-8 stopwords súboru. Každé slovo musí byť na samostatnom riadku.
  • ignore_case: TRUE spôsobí že sa všetky slová najprv prevedú na lowercase. Default je FALSE.
  • remove_trailing: FALSE spôsobí že posledné slovo vo vyhľadávanej fráze, ak je to stopword, nebude ignorované. To sa môže hodiť ak napr. do našepkávača napíšete frázu green a pričom a sa neodstráni a môže presnejšie zachytiť výraz green apple, hoci filter by inak posledné a odstránil. Default je TRUE.  

 Preddefinované zoznamy stopwords: _arabic__armenian__basque__bengali__brazilian__bulgarian__catalan__czech__danish__dutch__english__finnish__french__galician__german__greek__hindi__hungarian__indonesian__irish__italian__latvian__norwegian__persian__portuguese__romanian__russian__sorani__spanish__swedish__thai__turkish_.

 

Word Delimiter Token Filter

Filter word_delimiter rozdelí slová na pod-výrazy a vykoná voliteľnú transformáciu na skupinách sub-výrazov. Slová sú rozdelené do pod-výrazov podľa týchto pravidiel: 

  • Rozdelí tokeny cez defaultne všetky ne-alfa-numerické znaky napr. super-duper -> super, duper.
  • Odstráni rozdeľovače zo začiatku a z konca tokenov napr. //hello----there -> hello, there.
  • Rozdelí tokeny pri prechode z malého na veľké písmená napr. PowerShot -> Power, Shot
  • rozdelí tokeny pri prechode medzi člíslami a písmenami napr. SD500 -> SD, 500.
  • Odstráni koncové anglické 's z tokenov napr. O'Neil's -> O, Neil

Filter word_delimiter bol navrhnutý na odstránenie interpunkcie z identifikátorov ako sú produkt id alebo časti čísel. Pre tieto prípady sa odporúča použiť filter s keyword tokenizerom. 

Parametre:

  • generate_word_parts: Ak je TRUE vygeneruje písmenné subtokeny PowerShot -> Power, Shot; Wi-Fi -> Wi, Fi. Ak je FALSE tak písmenové tokeny vyhodí z výsledku. Default je TRUE.
  • generate_number_parts: Ak je TRUE vygeneruje číselné subtokeny 500-42 -> 500, 42. Ak je FALSE tak číselné tokeny vyhodí z výsledku. Default je TRUE.
  • catenate_numbers: Ak je TRUE filter okrem defaultných subtokenov vytvorí zo subtokenov aj tokeny ktoré pospájajú priľahlé číselné subtokeny dohromady napr. 01-02-mmm-03-44 -> 01, 0102, 02, mmm, 03, 0304, 04.  Default je FALSE. V spojení s match_phrase requestami bude toto nastavenie robiť propblémy.
  • catenate_words: Ak je TRUE vytvorí okrem default tokenov aj tokeny, ktoré pospájajú priľahlé písmenové subtokeny do jedného tokenu napr. wi-fi-20-xl -> wi, wifi, fi, 20, xl. Default je FALSE. V spojení s match_phrase requestami bude toto nastavenie robiť propblémy.
  • catenate_all: Ak je TRUE pospájajú sa všetky sub-tokeny do jedného tokenu. Default je FALSE.
  • split_on_case_change: Ik je TRUE rozdelí token "PowerShot" na Power, Shot. Výraz Power-Shot ostane bez zmeny. Default je TRUE.
  • preserve_original: Ak je TRUE tak okrem sub-tokenov zachová aj oroginány výraz. Napr: 500-42 -> 500-42, 500, 42 alebo supper-500-xl -> super-500-xl, super, 500, xl. Default je FALSE
  • split_on_numerics: Ak je TRUE tak vygeneruje j2se -> j, 2, se
  • stem_english_possessive: Ak je TRUE tak odstráni koncové s. Napr. O'Neil's -> O, Neil. Default je TRUE.
  • protected_words: Pole rezervovaných slow, ktoré nebudú rozdelené. 
  • protected_words_path: Cesta k súboru so zoznamom rezervovaných slov. Cesta je buď absolútna alebo relatívna ku config adresáru cca C://ProgramData/elastic... Súbor musí byť UTF-8 a každé slovo musí byť na novom riadku.
  • type_table: Pole znakov, ktoré umožňuje mapovať ne alfanumerické znaky ako numerické alebo alfanumerické a tým zabrániť rozdeleniu tokenov na týchto znakoch. 
    Napr. pole ["+ => ALPHA", "- => ALPHA"] sp;sob9 6e ynakz + a - sa vzhodnotia ako písmená a nebudú použité ako delimitery. Podporovaný typy: ALPHA, ALPHANUM, DIGIT, LOWER, SUBWORD, UPPER
  • type_table_path: Cesta k súboru so zoznamom ako v type_table. Absolutna alebo relatívna. Súbor UTF-8.

Použitie tokenizeru ako je standard tokenizer môže kolidovať s canete_* a preserve_original parametrami pretože originálny string môže stratiť interpunkciu počas tokenizácie. Miesto toho je lepšie použiť whitespace tokenizer.

To customize the word_delimiter filter, duplicate it to create the basis for a new custom token filter. You can modify the filter using its configurable parameters.

Nasl. príklad vytvorí word_delimiter filter s nasledujúcimi pravidlami:

  • Rozdeľ tokeny cez nealfanumerické znaky okrem znaku -.
  • Odstráň začiatočné a koncové oddeľovače z každého tokenu.
  • Nerozdeľuj tokeny cez camelCase rozdeľovač
  • Nerozdeľ tokeny cez rozdeľovač číslo tj. pri prechode z písmena na číslo.
  • Odstráň anglické koncové 's
PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "my_custom_word_delimiter_filter" ]
        }
      },
      "filter": {
        "my_custom_word_delimiter_filter": {
          "type": "word_delimiter",
          "type_table": [ "- => ALPHA" ],
          "split_on_case_change": false,
          "split_on_numerics": false,
          "stem_english_possessive": true
        }
      }
    }
  }
}

 

Word Delimiter Graph Token Filter

Filter word_delimiter_graph rozdelí tokeny do sub-tokenov a urobí voliteľné úpravy nad sub-tokenmi. Tokeny sa rozdelia podľa nasl. pravidiel:

  • rozdelí na nealfanumerických rozdeľovačoch. Napr. Wi-Fi -> Wi, Fi
  • rozdelí tokeny cez camelCase napr. PowerShot -> Power, Shot
  • rozdelí tokeny na rozhraní písmeno - číslo. SD500 -> SD, 500
  • odstráni delimitery na začiatku a na konici tokenov. //hello---there, dude -> hell, there, dude
  • odstráni koncové 's O'Neil's -> O, Neil 

Narozdiel od word_delimitera tento filter správne pracuje s pozíciami pre multi výrazovú expanziu :P počas search-time keď ktorákoľvek z nals. volieb je TRUE:

  • preserve_original
  • catenate_mumbers
  • catenate_words
  • catenate_all

Parametre:

  • generate_word_parts: Ak je TRUE vygeneruje písmenné subtokeny PowerShot -> Power, Shot; Wi-Fi -> Wi, Fi. Ak je FALSE tak písmenové tokeny vyhodí z výsledku. Default je TRUE.
  • generate_number_parts: Ak je TRUE vygeneruje číselné subtokeny 500-42 -> 500, 42. Ak je FALSE tak číselné tokeny vyhodí z výsledku. Default je TRUE.
  • catenate_numbers: Ak je TRUE filter okrem defaultných subtokenov vytvorí zo subtokenov aj tokeny ktoré pospájajú priľahlé číselné subtokeny dohromady napr. 01-02-mmm-03-44 -> 01, 0102, 02, mmm, 03, 0304, 04.  Default je FALSE. V spojení s match_phrase requestami bude toto nastavenie robiť problémy. Nastavenie parametra na TRUE generuje multiposition tokeny, ktrorých indexovnie nieje podporované. Ak chcete tento parameter použiť použite aj flatten_graph fllter.
  • catenate_words: Ak je TRUE vytvorí okrem default tokenov aj tokeny, ktoré pospájajú priľahlé písmenové subtokeny do jedného tokenu napr. wi-fi-20-xl -> wi, wifi, fi, 20, xl. Default je FALSE. V spojení s match_phrase requestami bude toto nastavenie robiť propblémy. Nastavenie parametra na TRUE generuje multiposition tokeny, ktrorých indexovnie nieje podporované. Ak chcete tento parameter použiť použite aj flatten_graph fllter. 
  • catenate_all: Ak je TRUE tak okrem default tokenov sa navyšše všetky sub-tokeny pospájanú do jedného tokenu. Default je FALSE. Nastavenie parametra na TRUE generuje multiposition tokeny, ktrorých indexovnie nieje podporované. Ak chcete tento parameter použiť použite aj flatten_graph fllter. 
  • split_on_case_change: Ik je TRUE rozdelí token "PowerShot" na Power, Shot. Výraz Power-Shot ostane bez zmeny. Default je TRUE.
  • preserve_original: Ak je TRUE tak okrem sub-tokenov zachová aj oroginány výraz. Napr: 500-42 -> 500-42, 500, 42 alebo supper-500-xl -> super-500-xl, super, 500, xl. Default je FALSE
  • split_on_numerics: Ak je TRUE tak vygeneruje j2se -> j, 2, se
  • stem_english_possessive: Ak je TRUE tak odstráni koncové s. Napr. O'Neil's -> O, Neil. Default je TRUE.
  • protected_words: Pole rezervovaných slow, ktoré nebudú rozdelené. 
  • protected_words_path: Cesta k súboru so zoznamom rezervovaných slov. Cesta je buď absolútna alebo relatívna ku config adresáru cca C://ProgramData/elastic... Súbor musí byť UTF-8 a každé slovo musí byť na novom riadku.
  • type_table: Pole znakov, ktoré umožňuje mapovať ne alfanumerické znaky ako numerické alebo alfanumerické a tým zabrániť rozdeleniu tokenov na týchto znakoch. 
    Napr. pole ["+ => ALPHA", "- => ALPHA"] sp;sob9 6e ynakz + a - sa vzhodnotia ako písmená a nebudú použité ako delimitery. Podporovaný typy: ALPHA, ALPHANUM, DIGIT, LOWER, SUBWORD, UPPER
  • type_table_path: Cesta k súboru so zoznamom ako v type_table. Absolutna alebo relatívna. Súbor UTF-8. 

 

Multiplexer Token Filter

Tento filter vygeneruje viacej tokenov na tej istej pozícii. Každá verzia tokenu prejde cez iný filter. Po vygenerovaní sú duplicitné tokeny odstránené. Ak vstupné tokeny obsahujú duplicity tie sa tiež odstránie. 

Parametre

  • filters: Pole filtrov, ktroré sa aplikujú na vstupné tokeny a každá kombinácia týchto filtrov svoje tokeny zaindexuje. Môže byť akýkoľvek filtre definované, kdekoľvek v index mappingu. Filtre môžu byť reťazené ako string oddelený čiarkou napr. ["lowercase", "lowercase, porter_stem"]. To znamená že sa indexujú tokeny pre lowercase a tokeny pre kombináciu lowercase a porter_stem filtre. Shingles alebo multi word token filter nebude fungoavť korektne v spojení s multiplexerom.
  • preserve_original: Ak je TRUE(default) vygeneruje navyšše aj originálny token. 

Lepšie sa to chápe na príklade

PUT /multiplexer_example
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : [ "my_multiplexer" ]
                }
            },
            "filter" : {
                "my_multiplexer" : {
                    "type" : "multiplexer",
                    "filters" : [ "lowercase", "lowercase, porter_stem" ]
                }
            }
        }
    }
}


POST /multiplexer_example/_analyze { "analyzer" : "my_analyzer", "text" : "Going HOME" }

Predošlý request vygeneruje takéto tokeny: Going, going, go, HOME, home

 

Conditional Token Filter

Tento filter príma parameter scripta a zoznam filtrov a script rozhoduje či sa daný filter na token bude aplikovať. 

Parametre

  • filter: zoznam token filtrov, ktoré sa majú aplikovať ak je splnená podmienka. Môžu to byť akékoľvek filtre definované v mappingu.
  • script: script ktorý rozohoduje či sa filtre na token aplikujú alebo nie. Podporované sú iba inline scripty.

Príklad

PUT /condition_example
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : [ "my_condition" ]
                }
            },
            "filter" : {
                "my_condition" : {
                    "type" : "condition",
                    "filter" : [ "lowercase" ],
                    "script" : {
                        "source" : "token.getTerm().length() < 5"  
                    }
                }
            }
        }
    }
}
Príklad aplikuje lowercase filter iba na tokeny kratšie ako 5 znakov.
 
 

Predicate Token Filter Script

Filter predicate_token_filter použije script a odstráni tokeny, ktoré neprejdú cez tento script.
 
Paramtre
  • script: script ktorý určuje či token bude indexovaný alebo nie. Podporované sú iba inline scripty.
PUT /condition_example
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : [ "my_script_filter" ]
                }
            },
            "filter" : {
                "my_script_filter" : {
                    "type" : "predicate_token_filter",
                    "script" : {
                        "source" : "token.getTerm().length() > 5"  
                    }
                }
            }
        }
    }
}

POST /condition_example/_analyze { "analyzer" : "my_analyzer", "text" : "What Flapdoodle" }

 Príklad indexuje tokeny, ktoré sú dlhšie ako 5 znakov a request wráti iba token Flapdoodle.

 

Stemmer Token Filter

Filter ktorý poskytuje prístup, takmer ku všetkým dostupným stemming token filtre cez jeden interface. Defaultne používa anglický porter stemming algorithm

Príklad

PUT /my_index
{
    "settings": {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["lowercase", "my_stemmer"]
                }
            },
            "filter" : {
                "my_stemmer" : {
                    "type" : "stemmer",
                    "name" : "light_german"
                }
            }
        }
    }
}

Preddefinované stemmer filtre nájdete v dokumentácii

 

Stemmer Override Token Filter

Filter stemmer_override poskytuje rozhranie pre custom mapping slov, ktoré budú následne vyňaté zo stemming filtra. Tento filter musí byť umiestnený pred stemming filtrami.

Parametre

  • rules: Pole mapovaných dvojíc. Kde kľúč je originálny token a hodnota na ktorú sa premapuje. 
  • rules_path: Cesta k súboru mappingom. 

Pravidlá sú oddelené cez separator =>

 
Súbor musí byť UTF-8 a každá dvojica musí byť na novom riadku napr.
running => run
stemmer => stemmer

Príklad

PUT /my_index
{
    "settings": {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["lowercase", "custom_stems", "porter_stem"]
                }
            },
            "filter" : {
                "custom_stems" : {
                    "type" : "stemmer_override",
                    "rules" : [
                        "running => run",
                        "stemmer => stemmer"
                    ]
                }
            }
        }
    }
}

 

 

Keyword Marker Token Filter

Filter obsahuje zoznam slov, ktoré nebudú modifikované cez stemmer filter. Z toho vyplýva, že musí byť umiestený pred stemming filtrom. 

Parametre

  • keywords: Pole slov, ktoré nebudú modifikované cez stemming filter.
  • keyword_path: Cesta k súboru so zoznamom slov. UTF-8 a každé slovo na novom riadku.
  • keyword_pattern: Regulárny výraz, ktorý sa použije miesto explicitných zoznamov.
  • ignore_case: Ak je TRUE najprv prevedie všetky slová na lowercase. Default je FALSE.
 

Príklad

GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "keyword_marker",
      "keywords": [ "jumping" ]
    },
    "stemmer"
  ],
  "text": "fox running and jumping"
}

Príklad vygeneruje tokeny: fox, run, and, jumpin. 

Ako vidno výraz running bol modifikovaný cez english stemmer filter ale výraz jumping zmenený stemmer filtrom nebol. 

 

Keyword Repeat Token Filter

Filter keyword_repeat vygeneruje každý token dva krát, raz ako keyword a raz ako ne-keyword a tak umožní indexovať dve verzie. Jednu v pôvodnej podobe a druhú po modifikácii stemmer filtra. Tento filter ako side efect spôsobí, že všetky tokeny, ktoré sú neni zmenené cez stemmer filter budú indexované 2x. Preto sa predpokladá použitie unique filtra s voľbou only_on_same_position nastavenou na TRUE čím sa zbavíme duplicít.

Príklad

PUT /keyword_repeat_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "stemmed_and_unstemmed": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "keyword_repeat", "porter_stem", "unique_stem"]
        }
      },
      "filter": {
        "unique_stem": {
          "type": "unique",
          "only_on_same_position": true
        }
      }
    }
  }
}

P
OST /keyword_repeat_example/_analyze { "analyzer" : "stemmed_and_unstemmed", "text" : "I like cats" }

Vygeneruje tokeny I, like, cats, cat. 

Keby sme nepoužile unique_stem tak by filter vygeneroval tokeny I, I, like, like, cats, cat.

 

KStem Token Filter

Filter kstem je high performace filter pre angličtinu. Všetky tokeny už musia prísť prevedené na lowercase aby tento filter fungoval korektne. 

 

Snowball Token Filter

Filter ktorý používa Snowwball-generated stemmer. 

Parametre

  • language: Podporuje nasl. hodnoty: ArmenianBasqueCatalanDanishDutchEnglishFinnishFrenchGermanGerman2HungarianItalianKpLithuanianLovinsNorwegianPorterPortugueseRomanianRussianSpanishSwedishTurkish.

For example:

PUT /my_index
{
    "settings": {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["lowercase", "my_snow"]
                }
            },
            "filter" : {
                "my_snow" : {
                    "type" : "snowball",
                    "language" : "Lovins"
                }
            }
        }
    }
}

 

Phonetic Token Filter

Tento filter je implementovaný ako analysis-phonetic plugin.

 

Synonym Token Filter

Filter synonym umožňuje implenetáciu synonym do procesu analyzy. 

Príklad

PUT /test_index
{
    "settings": {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "synonym" : {
                        "tokenizer" : "whitespace",
                        "filter" : ["synonym"]
                    }
                },
                "filter" : {
                    "synonym" : {
                        "type" : "synonym",
                        "synonyms_path" : "analysis/synonym.txt"
                    }
                }
            }
        }
    }
}
Synonymický slovník sa pridáva ako súbor. Tento filter tokenizuje synonymá s akýmkoľvek tokenizerom a filtrami, ktoré sú uvedené v poradí pred ním.
Formát súboru môže byť nasledovný:
# Explicitný mapping zachytí všetko čo je na ľavej strane od znaku => 
# a nahradí to všetkými alternatívami na pravej strane.
# Tento typ mapping ignoruje expand parameter.
# Príklad: i-pod, i pod => ipod, sea biscuit, sea biscit => seabiscuit # Druhý spôsob je oddeľovanie synonym čiarkou a je to neexplicitný mapping.
# V tomto prípade sa mapping bude chovaŤ podľa expand parametra.
# To umožňuje použiť jeden synonymický súbor použiť rozdielnym spôsobom. # Príklad: ipod, i-pod, i pod foozball , foosball universe , cosmos lol, laughing out loud # Ak je parameter expand TRUE, "ipod, i-pod, i pod" je ekvivalent explicitného zápisu: ipod, i-pod, i pod => ipod, i-pod, i pod # Ak expand je FALSE, "ipod, i-pod, i pod" je ekvivalent explicitného zápisu: ipod, i-pod, i pod => ipod # Viacnásobné mapovanie toho istého vstupu spojené. foo => foo bar foo => baz # is equivalent to foo => foo bar, baz
 
Parametre
  • expand: Default TRUE
  • lenient: Default FASLE. Ak je TRUE ignoruje chyby počas parsovania configurácie synonym. Ignorované sú iba tie pravidlá, ktoré sa nedajú sparsovať. Napríklad
    PUT /test_index
    {
        "settings": {
            "index" : {
                "analysis" : {
                    "analyzer" : {
                        "synonym" : {
                            "tokenizer" : "standard",
                            "filter" : ["my_stop", "synonym"]
                        }
                    },
                    "filter" : {
                        "my_stop": {
                            "type" : "stop",
                            "stopwords": ["bar"]
                        },
                        "synonym" : {
                            "type" : "synonym",
                            "lenient": true,
                            "synonyms" : ["foo, bar => baz"]
                        }
                    }
                }
            }
        }
    }
    Explicitný mapping všetko čo je naľavo od znaku => sa nahradí výrazom na pravej strane. Takže výrazy foo a bar sa nahradia pri indexovaní výrazom baz. Okrem toho si všimnite, že výraz bar je uvedený v stopwords a tým pádom bude preskočený. Keby mapping vyzeral takto: foo, baz ⇒ bar tak by sa neindexovalo vôbec nič. 
    Ak by bol mapping nasledovný bar, foo, baz a expand parameter by bol FALSE nič by sa neindexovalo, pretože výsledkom mappingu je prvý výraz bar. 
    Ak by bol param. expand TRUE bol by to ekvivalent k explicitnému mapping foo, baz => foo, baz. Vypadlo by bar kôli stopwords. 
 

Pravdepodobne najpoužívanejší je mapping kde viac výrazov sa spojí do jedného. 

 

Synonym Graph Token Filter

Filter synonym_graph umožňuje poľahky spracovať synonymá vrátane viac slovné synonymá korektne počas analytického procesu. 

Aby správne spracoval viac slovné tenti filter vytvorí "graph token stream" počas spracovania. Pre viac informácií pozri Lucene’s TokenStreams are actually graphs blog post.

Tento token filter je určený na použitie iba v search analyzeroch. Počas indexovania použite štandardný synonym token filter
 
Synonymá sú konfigurované cez configuračný súboru. 
 
Príklad
PUT /test_index
{
    "settings": {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "search_synonyms" : {
                        "tokenizer" : "whitespace",
                        "filter" : ["graph_synonyms"]
                    }
                },
                "filter" : {
                    "graph_synonyms" : {
                        "type" : "synonym_graph",
                        "synonyms_path" : "analysis/synonym.txt"
                    }
                }
            }
        }
    }
}

Parametre

  • expand: viď synonym filter
  • lenient: viď synonym filter

Dokumentácia je rovnaká ako pri synonym filtri...

 

Compound Word Token Filter

Filtre hyphenation_decompoder a dictionary_decompoder token filtre vedia rozdeliť zložené slová v mnohých germánskych jazykoch na jednotlivé časti.

Obidva token filtre vyžadujú slovník slovných častí, ktoré môžu byť definované cez parametre buď  ako pole word_list alebo ako súbor cez word_list_path

The hyphenation_decompounder and dictionary_decompounder token filters can decompose compound words found in many German languages into word parts.

Tento filter so slovenčinou asi moc nevyužijete, takže to zostručníme odkazom na dokumentáciu.

 

Reverse Token Filter

Jednoducho všetky tokeny uloží odzadu. To znamená že token cat sa uloží ako tac. Môže sa to hodiť ako chcete vyhľadávať napr. podľa prípon ako -iňa, ová..

 

Elision Token Filter

Filter elision sa používa s jazykmi ako je francúština a umožňuje odstrániť elisions (ani Google to nevedel preložiť). Napr. "l'avion" sa indexuje ako avion.

To asi v slovenčine moc nevyužijeme takže to preskočíme odkazom do dokumentácie

 

Truncate Token filter

Filter truncate sa dá použiť na skrátenie tokenov na požadovanú dlžku. 

Parametre

  • length: počet písmen na ktorý sa token skráti. Default je 10.

 

Unique Token Filter

Filter unique zaindexuje iba unikátne tokeny. 

Parametre

  • only_on_same_position: Default FALSE. Ak je TRUE odstráni duplicity iba ak sú na rovnakej pozícii.
GET _analyze
{
  "tokenizer" : "whitespace",
  "filter" : ["unique"],
  "text" : "the quick fox jumps the lazy fox"
}

Vygeneruje tokeny: the, quick, fox, jumps, lazy

 

Pattern Capture Token Filter

Filter pattern_capture narozdiel od pattern tokenizeru vygeneruje token pre každú zachytenú skupinu v regulárnom výraze. Výraz nieje naviazaný na začiatok alebo na koniec tokenu. Pattern môže zachytiť viacnásobnú zhodu a taktiež sa môžu zachytené výrazy prekrývať.

 Príklad

"(([a-z]+)(\d*))"

ak predošlý pattern aplikujeme na token

"abc123def456"

vygeneruje tokeny: abc123abc123def456def456

 

Pattern Replace Token Filter

Filter pattern_replace umožňuje nahradenie reťazca v tokenoch na základe regulárneho výrazu. Sú teda potrebné dva parametre prvý je pattern a druhá je replacement. replacement umožnuje odkazovať sa na subvýrazy regulárneho výrazu here

 

Trim Token Filter

Odstráni biele znaky okolo tokenov

GET _analyze
{
  "tokenizer" : "keyword",
  "text" : " fox "
}

Dúfam že je jasná čo trim urobí s takýmto term tokenom.

 

Limit Token Filter

Filter limit limituje počet tokenov, ktoré sa indexujú na jeden dokument. 

Parametre:

  • max_token_count: Max. počet tokenov na jeden dokuemnt. Default je 1.
  • consume_all_tokens: Nie som si sitý či chápem čo toto znamená ale zdá sa že je TRUE tak filter neberie ohľad na max_token_count ale pokračuje kým nevyčerpá stream. Default je FALSE. 
GET _analyze
{
  "tokenizer": "standard",
    "filter": [
    {
      "type": "limit",
      "max_token_count": 2
    }
  ],
  "text": "quick fox jumps over lazy dog"
}

Vráti 2 tokeny: quick, fox

 

Hunspell Token Filter

Základná podpora pre hunspell stemming. táto téma je pekne rozobratá na zdrojáku. Sám by som to lepšie nenapísal. Táto funkcionalita v podstate zoberie token a pokúsi sa pre daný jazyk v slovníku nájsť základ slova. Tento základ sa potom indexuje miesto pôvodného tokenu. Napr. výraz "mužskej móde" sa najprv tokenizuje na tokeny "mužskej" a "móde" a hunspell filter z nich spraví tokeny: "mužský" a "móda". 

Je to Hunspell slovníky sa zoberú z vyhradeného adresára (<path.conf>/hunspell). Každý slovník musí byť vo svojom vlastnom adresári označenom ako local napr. en_US, sk_SK, cs_CZ... Každý tento adresár musí obsahovať jeden súbor *.aff a jeden alebo viac *.dic súborov. 

Príklad

- conf
    |-- hunspell
    |    |-- en_US
    |    |    |-- en_US.dic
    |    |    |-- en_US.aff

Každý slovník môže byť, konfigurovaný nastavením parametra ignore_case

  • ignore_case: Ak je TRUE bude zhoda case insensitive. Dafault je FALSE.

Toto nastavenie je možné nastaviŤ aj globálne v elaaticsearch.yml použitím 

  • indices.analysis.hunspell.dictionary.ignore_case
alebo pre určité slovníky
  • indices.analysis.hunspell.dictionary.en_US.ignore_case

Príklad 

PUT /hunspell_example
{
    "settings": {
        "analysis" : {
            "analyzer" : {
                "en" : {
                    "tokenizer" : "standard",
                    "filter" : [ "lowercase", "en_US" ]
                }
            },
            "filter" : {
                "en_US" : {
                    "type" : "hunspell",
                    "locale" : "en_US",
                    "dedup" : true
                }
            }
        }
    }
}

Parametre:

  • locale: jazyk
  • dictionary: Názov slovníka. Cesta k slovníkom by mala byť nakonfigurovaná cez indices.analysis.hunspell.dictionary.location
  • dedup: Default TRUE. Určuje či sa odstránia duplicity. 
  • longest only: Ak je TRUE indexujú sa iba najdlhšie nájdené výrazy pre daný token. Default je FALSE. 

Slovníky sa nahrávajú pri štarte Elasticsearchu. Dá sa to zmeniť nastavením indices.analysis.hunspell.dictionary.lazy na TRUE.

Tu je niekoľko užitočných odkazov z dokumentácie:

  1. Wikipedia, http://en.wikipedia.org/wiki/Hunspell
  2. Source code, http://hunspell.sourceforge.net/
  3. Open Office Hunspell dictionaries, http://wiki.openoffice.org/wiki/Dictionaries
  4. Mozilla Hunspell dictionaries, https://addons.mozilla.org/en-US/firefox/language-tools/
  5. Chromium Hunspell dictionaries, http://src.chromium.org/viewvc/chrome/trunk/deps/third_party/hunspell_dictionaries/

 

Common Grams token Filter

Filter common_grams generuje k normálnym tokenom ešte bigram tokeny pre frekventované výrazy. Dá sa to použiť ako alternatíva k stop token filtru. Napr. text "the quick brown is a fox" vygeneruje tokeny: the, the_quick, quick, brown, brown_is, is, is_a, a, a_fox, fox ak predpokladáme že the, is, a sú common terms. 

Parametre

  • common_words: Pole common words. 
  • common_words_path: Cesta k UTF-8 súboru s common_words.
  • ignore_case: Ak je TRUE ignrujú sa veľké a malé písmená. Default je FALSE.
  • query_mode: Ak je TRUE filter vyhodí niektoré tokeny podľa nasl. pravidiel.
    - vyhodí unigramy pre common_words
    - vyhodí unigramy tokenov, ktoré sú PRED common words
    - ak je posledné slovo po common worde tak sa vytvorí iba bigram týchto dvoch unigram sa vyhodí.
    Text "The quick fox is brown" sa tokenizuje ako The_quick, quick, fox_is, is_brown. Všimnite si že vypadli tokeny pre fox(pravidlo 2) a brown(pravidlo 3)

 

Normalization Token Filter

Elstic obsahuje niekoľko týchto filtrov ktoré sa pokúšajú normalizovať špeciálne znaky v niektorých jazykoch. Tu je zoznam: arabic_normalization, german_normalization, hindi_normalization, indic_normalization, sorani_normalization, persian_normalization, scandinavian_normalization, scandinavian_folding, serbian_normalization

 

CJK Width Token Filter

Toto fakt nebudem prekladať....

Normalizes width differences in CJK (Chinese, Japanese, and Korean) characters as follows: viď dokumentácia

 

CJK Bigram Token Filter

Veď dokumentácia 

 

Delimited Payload Token Filter

Filter delimited_payload rozdelí tokeny na token a payload (užitočné zaťaženie :D) kedykoľvek narazí na delimiter, ktorý oddeľuje token od payloadu. Ak máme napr. vetu "The|1 quick|2 fox|3" rozdelí text podľa default rozdeľovača na tokeny: The, quick, fox a payloads 1, 2, 3 

Example: "the|1 quick|2 fox|3" is split by default into tokens thequick, and fox with payloads 12, and 3 respectively.

Parameters:
  • delimiter: znak ktorý oddeľuje tokeny a playload
  • encoding: Typ payloadu. int, float, identity (písmená). Default float
 

Keep Words Token Filter

 
Filter keep ponechá iba tokeny, ktoré sú v definovanom zoznam slov. 

Parametre

  • keep_words: Pole slov, ktoré sa majú indexovať
  • keep_words_path: Cesta k súboru so zoznamom slov.
  • keep_words_case: Ak je TRUE prevedie tokeny na lowercase. Default je FALSE.

Príklad

GET _analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "keep",
      "keep_words": [ "dog", "elephants", "fox" ]
    }
  ],
  "text": "the quick elephant jumps over the lazy dog and fox"
}

Príklad vygeneruje tokeny fox a  dog. Elephant sa nezhoduje s elephants.

 

Keep Types Token Filter

Filter keep_types ponechá iba tokeny, ktoré majú token typ ktorý je definovaný zozname.

Parametre

  • types: Pole typov, ktoré budú povolené(defaultné chovanie include) pre indexovanie, alebo ktroé budú naopak vyhodené podľa nastavenia parametra mode
  • mode: Ak je nastavené na include (default) tak budú tokeny zo zoznamu indexované. Ak je exclude tak budú tokeny zo zoznamu vyhodené. 

Typy nastavuje tokenizer keď konvertuje znaky na tokeny. Typy sa môžu líšiť v závisosti na tokenizere. Napr. standard tokenizer generuje viacej typov napr. <ALPAHNUM>, <HANGUL>, <NUM>.... Simple analyzery ako lowercase tokenizer generuje iba typ word. Niektoré token filtre tiež môžu pridávať typy napr. sinonym filter pridáva typ <synonym>.

Príklad

GET _analyze
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "keep_types",
      "types": [ "<NUM>" ]
    }
  ],
  "text": "1 quick fox 2 lazy dogs"
}

Príklad vygeneruje tokeny: 1 a 2

Príklad na exclude

GET _analyze
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "keep_types",
      "types": [ "<NUM>" ],
      "mode": "exclude"
    }
  ],
  "text": "1 quick fox 2 lazy dogs"
}
Príklad vygenetuje tokeny: quick, fox, lazy, dogs
 
 

Classic Token Filter

Filter classic vykoná voliteľný post-procesing tokenov, ktoré boli vygenerované classic tokenizerom

napr. odstráni bodky zo skratiek alebo privlastňovanie z anglických výrazov. 

Príklad

GET /_analyze
{
  "tokenizer" : "classic",
  "filter" : ["classic"],
  "text" : "The 2 Q.U.I.C.K. Brown-Foxes jumped over the lazy dog's bone."
}
Vygeneruje tokeny: The, 2, QUICK, Brown, foxes, jumped, over, the, lazy, dog, bone
 
 

Apostrophe Token Filter

Filter apostrophe odstráni všetky znaky za apostrofom vrátane apostrofu.
 
 

Decimal Digit Filter

 
Filter decimal digit zkonvertuje všetky čísla na Unicode Decimal_Number. Napr. bengalsky znak na 3
 
 

Fingerprint Token Filter

 
Vygeneruje z tokenov jeden token, v ktorom budú predošlé tokeny zoradené abecedne a budú odstránené duplicity. Napr. tokeny "the", "quick", "brown", "fox", "was" ,"very", "brown" budú skonvertované na token "brown, fox, quick, the, very was". 

Parametre

  • separator: Default medzera. Spojovník medzi tokenmi.
  • max_output_size: Default 255. Ak je limit prekročený token sa nevytvorí a pole bude prázdne.

 

Min Hash Token Filter

Filter min_hash hešuje každý token a rozdelí výsledné heše into buckets (?). Miesto tokenov vráti heše. 

Parametre

  • hash_count: Počet hešov, ktorými sa hešuje token stream. Default je 1
  • bucket_count: počet bucketov na ktroé sa rozdelí heš. Ak niekto chápe o čom to je kľudne napíšte do komentáru. Default  512
  • hash_set_size: Počet minihešov to keep per bucket. :D Default je 1
  • with_rotation: I am sorry. Whether or not to fill empty buckets with the value of the first non-empty bucket to its circular right. Only takes effect if hash_set_size is equal to one. Defaults to true if bucket_count is greater than one, else false.
 

No nič toto je nad moje sily viď dokumentácia.

 

Remove Duplicates Token Filter

Filter remove_duplicates vyhodí duplicitné tokeny na rovnakej pozícii.

Nasl. príklad použije keyword_repeat filter, ktorý zduplikuje tokeny a stemmer filter ktorý vytvorí stemmed a unstemmed verziu tokenov z textu jumping dog. 

GET _analyze
{
  "tokenizer": "whitespace",
  "filter": [
    "keyword_repeat",
    "stemmer"
  ],
  "text": "jumping dog"
}

Request vráti nasl. result, kde tokeny dog sú duplicity a majú rovnakú pozíciu

{
  "tokens": [
    {
      "token": "jumping",
      "start_offset": 0,
      "end_offset": 7,
      "type": "word",
      "position": 0
    },
    {
      "token": "jump",
      "start_offset": 0,
      "end_offset": 7,
      "type": "word",
      "position": 0
    },
    {
      "token": "dog",
      "start_offset": 8,
      "end_offset": 11,
      "type": "word",
      "position": 1
    },
    {
      "token": "dog",
      "start_offset": 8,
      "end_offset": 11,
      "type": "word",
      "position": 1
    }
  ]
}
 Pridaním remove_duplicates filtra za stemmer filter sa tento problém odstráni.
 
Ak chcete pridávať komentáre musíte sa prihlásiť