web.php5.sk

Elasticsearch - mapping III

18. apríl 2020 / Čamo

Popis jednotlivých mapping nastavení. Prvý je analyzer. Voľný preklad dokumentácie.

Analyzer

Hodnota analyzovaného reťazca prejde cez analyzer a zkonvertuje reťazec na tokeny. Napr. reťazec "the quick brown foxes" v závislosti aký analyzer sa použije bude analyzovaný do tokenov: quick, brown, fox. Toto sú výrazy(terms), ktoré budú indexované pre daný string. To umožňuje efektívne vyhľadávať jednotlivé slová v rozsiahlych textoch.

Analyzery sa skladajú v zásade z dvoch základných kameňov. Prvý je tokenizer a druhý je filter. tokenizer rozdelí reťazec na tokeny a filter tieto tokeny upravý napr. na lowecase alebo vyhodí stopwords.

Tento proces analyzovania neprebieha iba pri indexovaní, ale aj pri samotných requestoch tj. pri vyhľadávaní. Query string bude tiež analyzovaný rovnakým, alebo podobným analyzerom, takže slová, ktoré sa pokúša vyhľadať budú mať rovnaký formát ako tokeny v indexe.

Elasticsearch obsahuje niekoľko preddefinovaných analyzerov, ktoré je možné použiť. Tiež obsahuje niekoľko charakter filtrov, tokenizerov, a token filtrov, ktoré sa dajú kombinovať do vlastných analyzátorov pre konkrétny index. :D 

Analyzer môže byť špecifický pre query, pre field a pre index. Počas indexovania, Elasticsearch bude hľadať príslušný analyzer v tomto poradí:

  • Analyzer definovaný v mappingu pre konkrétny field.
  • Analyzer pomenovaný ako default v nastaveniach indexu.
  • Nakoniec ak nenájde žiadny z predošlých použije standard analyzer.

Počas query time je možné definovať viac analyzerov:

  • Analyzer definovaný vo fulltext query.
  • Analyzer definovaný ako search_analyzer v mappingu pre konkrétny field v indexe.
  • Analyzer definovaný v mappingu pre field v indexe.
  • Analyzer pomenovaný ako default_search v nastaveniach indexu.
  • Analyzer pomenovaný ako default v nastaveniach indexu.
  • Ako poslednú možnosť použije standard analyzer.

Príklad analyzera pre konkrétny field v indexe:

PUT /my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "text": { 
          "type": "text",
          "fields": {
            "english": { 
              "type":     "text",
              "analyzer": "english"
            }
          }
        }
      }
    }
  }
}

GET my_index/_analyze 
{
  "field": "text",
  "text": "The quick Brown Foxes."
}

GET my_index/_analyze 
{
  "field": "text.english",
  "text": "The quick Brown Foxes."
}

Pole text používa defaultný standard analyzer. Pole text.english pod kľúčom fields použije english analyzer, ktorý odstraňuje anglické stop words a aplikuje steaming.

Prvý request na field text vytvorí tokeny: the, quick, brown, foxes.

Druhý request na field text.english vytvorí tokeny: quick, brown, fox.

search_quote_analyzer

Je nastavenie, ktoré umožňuje nastaviť analyzer pre frázy. To je užitočné ak potrebujete zachovať stop words pre vyhľadávanie fráz.

Zachovanie stop words pre frázy nastavíme tri analyzery pre daný field v indexe.

  1. Analyzer pre indexovanie všetkých slov vrátane stop words.
  2. Analyzer search_analyzer pre ne-frázové vyhľadávanie, ktorý odstráni stop words. 
  3. Analyzer search_quote_analyzer pre vyhľadávanie fráz, ktroý neodstráni stop words
PUT my_index
{
   "settings":{
      "analysis":{
         "analyzer":{
            "my_analyzer":{ 
               "type":"custom",
               "tokenizer":"standard",
               "filter":[
                  "lowercase"
               ]
            },
            "my_stop_analyzer":{ 
               "type":"custom",
               "tokenizer":"standard",
               "filter":[
                  "lowercase",
                  "english_stop"
               ]
            }
         },
         "filter":{
            "english_stop":{
               "type":"stop",
               "stopwords":"_english_"
            }
         }
      }
   },
   "mappings":{
      "_doc":{
         "properties":{
            "title": {
               "type":"text",
               "analyzer":"my_analyzer", 
               "search_analyzer":"my_stop_analyzer", 
               "search_quote_analyzer":"my_analyzer" 
            }
         }
      }
   }
}

PUT my_index/_doc/1
{
   "title":"The Quick Brown Fox"
}

PUT my_index/_doc/2
{
   "title":"A Quick Brown Fox"
}

GET my_index/_search
{
   "query":{
      "query_string":{
         "query":"\"the quick brown fox\"" 
      }
   }
}
  • my_analyzer tokenizuje všetky slová vrátane stop words.
  • my_stop_analyzer odstráni stop words.
  • analyzer pre field title, ukazuje na my_analyzer a použije sa počas index time.
  • search_analyzer pre field title ukazuje na my_stop_analyzer, ktorý odstráni stop words a použije sa pre non-phrase vyhľadávanie.
  • search_quote_analyzer pre field title ukazuje na my_analyzer, ktorý zachováva stop words a použije sa pre phrase queries 
  • Pretože query je obalená do úvodzoviek je detekovaná ako phrase query a preto sa použije search_quote_analyzer. my_analyzer vráti nasledujúce tokeny - the, quick, brown fox. Tým pádom zachytí prvý dokument (v kontexte frázy iba prvý dokument).

 

Dostupné preddefinované analyzéry

Standard Analyzer (link)

Rozdelí (tokenizuje) text na výrazy, založené na znakoch ohraničujúcich slová definovaných Unicode Text Segmentation algoritmom. Odstráni väčšinu interpunkčných znamienok, pevedie na lowercase a podporuje stop words.

Je to defaultný analyzer, ktorý a použije ak nieje uvedný iný analyzer. 

Vetu: "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." 
prevedie na tokeny: 2, quick, brown, foxes, jumped, over, lazy, dog's, bone

Standard analyzer akceptuje nasledujúce parametre:

  • max_token_length: Pri prekročený max. dlžky tokenu sa výraz rozdelí.
  • stopwords: Preddefinovaný stop words zoznam ako _english_ alebo pole alebo pole. Default je _none_.
  • stop_words_path: Cesta k súboru so stop words. Buď absolútna,alebo relatívna. Relatívna je na Win 10 cca C:\\ProgramData\Elasticsearch\config\stop_words.txt. Súbor musí byť v UTF-8 a každé slovo musí byť na samostatnom riadku. 

Príklad:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard",
          "max_token_length": 5,
          "stopwords": "_english_"
        }
      }
    }
  }
}

Standard analyzer je zložený z 

Tokenizer

Token Filters

 

Simple analyzer (link)

Rozdelí text na jednotlivé výrazy kedykoľvek narazí na znak, ktorý nieje písmeno a prevedie na lowercase

Vetu: "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
prevedie na tokeny:
the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone

Simple analyzer sa nedá konfigurovať.

Simple analyzer je zložený z

Tokenizer

Stop Anylyzer (link)

Podobá sa na simple analyzer, ale navyšše podporuje stop words.

Stop analyzer akceptuje tieto parametre:

  • stopwords: Preddefinovaný stop words zoznam ako _english_ alebo pole. Default je _none_. 
  • stopwords_path: Cesta k súboru so stop words. Buď absolútna,alebo relatívna. Relatívna je na Win 10 cca C:\\ProgramData\Elasticsearch\config\stop_words.txt. Súbor musí byť v UTF-8 a každé slovo musí byť na samostatnom riadku. 
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}

Stop analyzer je zložený z

Tokenizer

Token filters

Whitespace Analyzer (link)

Rozdelí text na jednotlivé výrazy kedykoľvek narazí na biely (whitespace) znak. Neprevedie na lowercase.

Whitspace analyzer sa nedá konfigurovať

Whitespace analyzer je zložený z

Tokenizer

Vetu: "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
prevedie na tokeny: The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. (bodka na konci je token)

Keyword Analyzer (link)

Je tzv. "noop" analyzer, ktorý celý vložený text uloží kompletne v celku ako jeden výraz (token).

Keyword analyzer sa nedá konfigurovať.

Keyword analyzer je zložený z

Tokenizer

Ak potrebujete kustomizovať keyword analyzer musíte ho definovať ako custom analyzer a modifikovať ho. Zvyčajne pridaním token filtrov napr. lowercase...  

{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_keyword": {
          "tokenizer": "keyword",
          "filter": [         
          ]
        }
      }
    }
  }
}

Pattern Analyzer (link)

Použije regulárny výraz podľa ktorého rozdelí text na jednotlivé výrazy. Podporuje lowercase a stop words filter. The pattern analyzer uses Java Regular Expressions. Zle navrhnutý reg. výraz môže výrazne spomaliť vyhľaddávanie. Default je \W+

Pattern analyzer akceptuje tieto parametre:

  • pattern: Java Regular Expressions
  • flags: Java regular expression flags. Mali by byť oddelené pipou "CASE_INSENSITIVE|COMMENTS".
  • lowercase: default je TRUE
  • stopwords: Preddefinovaný zoznam alebo pole. Default je _none_
  • stopwords_path: viď vyššie.
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_email_analyzer": {
          "type":      "pattern",
          "pattern":   "\\W|_", 
          "lowercase": true
        }
      }
    }
  }
}

Výraz: "John_Smith@foo-bar.com"
prevedie na:
john, smith, foo, bar, com

Pattern analyzer je zložený z

Tokenizer

Token Filters

Language Analyzer (link)

Elastic podporuje množstvo jazykovo špecifických analyzerov. Zoznam podporovaných jazykov: arabicarmenianbasquebengalibrazilianbulgariancatalan,   cjk,   czech,   danish,   dutch,   englishfinnishfrenchgaliciangermangreekhindihungarianindonesianirishitalianlatvianlithuaniannorwegianpersianportugueseromanianrussiansoranispanishswedishturkishthai.

Všetky language nalyzery podporujú stop words interne alebo cez externý súbor (stopwords_path). 

Vynechanie slov zo stemmingu (+-skloňovania)

Parameter stem_exclusion umožňuje špecifikovať pole lowercase slov, ktoré by nemali byť očistené od skloňovania/prípon/.... Interne je táto funkcionalita implementovaná pridaním fltra typu keyword_marker so sadou výrazov, ktoré sú predané ako hodnota do stem_excusion parametra.

Tieto analyzery podporujú custom nastavenia stem_exclusion list: arabic,  armenian,  basque, bengali, bulgarian,  catalan,  czech,  dutch,  english,  finnish,  french,  galician,  german,  hindi,  hungarian,  indonesian,  irish,  italian,  latvian,  lithuanian,  norwegian,  portuguese,  romanian,  russian,  sorani,  spanish,  swedish,  turkish.

Ako vidíte slovak language analyzer neexistuje a to ani vo verzii 7. 

Fingerprint Analyzer (link)

Špeciálny analyzer, ktorý sa používa na detekovanie duplicít :P a vytvorí zo všetkých slov jeden token.

Intup text sa transformuje na lowercase, normalizuje sa, zoradí tokeny abecedne, vyhodí duplicity a všetky tokeny spojí do jedného tokenu. Aj je pridaný stopwords filter vyhodia sa aj stopwords.

Vetu: "Yes yes, Gödel said this sentence is consistent and."
prevedie na jeden token: and consistent godel is said sentence this yes (všimnite si radenie)

Fingerprint analyzer akceptuje tieto parametre:

  • separator: znak ktorý sa použije na spojenie výsledných tokenov. Default je medzera.
  • max_output_size: Max dlžka tokenu. Default je 255. Tokeny dlhšie ako max budú odstránené.
  • stopwords: viď. vyššie.
  • stopwords_path: viď. vyššie.

Fingerprint analyzer sa skladá z

Tokenizer

Token Filters (in order)

A to je koniec. Z uvedeného textu sa dá pochopiť, že každý preddefinovaný analyzer sa dá prepísať na voliteľnú kombináciu tokenizeru a filtrov podľa potreby. Hotoho. Hirošima hadr.

Ak chcete pridávať komentáre musíte sa prihlásiť