web.php5.sk

Elasticsearch - mapping I

17. apríl 2020 / Čamo

Vitajte a čítajte. Pre moju osobnú potrebu som sa rozhodol spísať článok, ktorý by aspoň zhruba popisoval základné nastavenia Elasticsearch indexov. Poďme na to.

Mapping

Mapping je proces definovania akým spôsobom bude dokument a hodnoty ktoré obsahuje uložené a indexované v databáze. Mapujeme napr. 

  • Ktorý reťazec by mal byť indexovaný ako fulltext.
  • Ktoré polia obsahujú čísla, dátumy alebo geolokátory.
  • Či hodnoty všetkých polí v dokumente majú byť indexované ako spoločne do catch-all _all poľa. (potom je možné vyhľadávať naraz nad všetkými poliami v indexe)
  • Formát dátumových hodnôt - format.
  • Pravidlá pre mapovanie dynamicky pridávaných polí - dynamically added fields.


Každý index má jeden typ dokumentov. Elasticsearch pred verziou 6.0.0 povoľoval viac typov v jednom indexe. 

Každý field v dokumente má definovaný typ, ktorý môže byť jeden z nasledujúcich: 

Častokrá je užitočné indexovať tú istú hodnotu rôznym spôsobom pre rozne použitie. Napríklad reťazec môže byť indexovaný ako typ text pre fulltextové vyhľadávanie a ako typ keyword pre radenie alebo agregácie. Alebo môžte indexovať reťazce so štandardným analyzérom, anglickým analyzérom a francúzskym analyzérom. Toto je zmysel existencie multi-field polí. Množstvo typov podporuje fields parameter.

Prevencia mapping explosion

Definovanie príliš veľkého množstva polí, vedie k tzv. mapping explosion, čo spôsobuje problémy s pamäťou. Napríklad v situácií ak každý nový dokument pridáva nové pole do indexu. To je bežné pri dynamických indexoch. To nieje problém pri malých počtoch niekoľko tisíc dokumentov. Toto je možné ovplyvniť nasledujúcimi nastaveniami v mappingu:

  • index.mapping.total_fields.limit Maximálny počet polí v indexe. Defaultná hodnota je 1000.
  • index.mapping.depth.limit Maximálna hĺbka zanorenia polí v objektoch. Defaultná hodnota je 20.
  • index.mapping.nested_fields.limit Maximálny počet jedinečných vnorených polí v indexe. Defaultná hodnota je 50.

Dynamický mapping

Polia a typy nemusia byť definované pred samotným vložením. Vďaka dynamickému mappingu nové polia budú pridané a otypované automaticky pri pridaní dokumentu. Nové polia môžu byť pridané ko top level field alebo ako pole objektu alebo ako pole objektu v nested štruktúre

Explicit mappings

Ak poznáte štruktúru vkladaných dokumentov je lepšie použiť explicitné mapovanie pri vytváraní indexu. Pridávať polia do indexu je možné aj po vytvorení indexu PUT mapping API ale existujúce polia už nieje možné premapovať. Ak je nutné premapovať existujúce pole musíte vytvoriť nový index s novým mappingom. Premenovať existujce pole je možné cez pridanie aliasu. 

Príklad mappingu pri vytváraní indexu:

PUT my_index 
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}

Vytvárame index my_index. Typ dokumentov je _doc. Definícia polí je pod kľúčom properties. Pole title a name sú typu text. Pole age j typu integer. Pole created je typu date a može mať dva povolené formáty. 

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