42
{po slovensky}. Igor Rjabinin {lab.SNG} elastic{search}.

Elasticsearch po slovensky

  • Upload
    labsng

  • View
    239

  • Download
    10

Embed Size (px)

Citation preview

Page 1: Elasticsearch po slovensky

{po slovensky}.

Igor Rjabinin {lab.SNG}

elastic{search}.

Page 2: Elasticsearch po slovensky

–Elasticsearch: The Definitive Guide

Elasticsearch is a real-time distributed search and analytics engine. It allows you to explore your data at a speed

and at a scale never before possible. It is used for full-text search,structured search, analytics, and all three in combination.

Page 3: Elasticsearch po slovensky

WIKIPEDIA• fulltext vyhľadávanie • “search-as-you-type” & “did-you-mean” • zvýraznenie hľadaného výrazu vo výsledkoch

STACKOVERFLOW• fulltext vyhľadávanie • “more-like-this”

GITHUB• vyhľadávanie v ~130*109 riadkoch kódu

Page 4: Elasticsearch po slovensky

DISTRIBUTED• horizontálne škálovatelný

APACHE LUCENE• “Information retrieval software library” • umožňuje vysoko výkonné pokročilé vyhľadávanie

RESTful API• komunikácia použitím JSON cez HTTP • curl -X /get,put,post,delete/

Page 5: Elasticsearch po slovensky

SQL vs elasticsearch

• SQL je relačná databáza • elastic je vyhľadávací engine

filtrovanie na binárnej úrovni

fulltext vyhľadávanie + filtrovanie na binárnej úrovni

Page 6: Elasticsearch po slovensky

SQL vs elasticsearch

database → table → row

index → type → document

Page 7: Elasticsearch po slovensky

INŠTALÁCIA

>  brew  install  elasticsearch  (…)  >  cd  /usr/local/Cellar/elasticsearch/1.3.4  >  bin/plugin  -­‐i  elasticsearch/marvel/latest  (…)  >  launchctl  load  ~/Library/LaunchAgents/      homebrew.mxcl.elasticsearch.plist  

Page 8: Elasticsearch po slovensky

TEST

>  curl  -­‐X  GET  localhost:9200  

{      "status"  :  200,      "name"  :  "Jim  Hammond",      "version"  :  {          "number"  :  "1.3.4",          "build_hash"  :  "a70f3ccb52200f8f2c87e9c370c6597448eb3e45",          "build_timestamp"  :  "2014-­‐09-­‐30T09:07:17Z",          "build_snapshot"  :  false,          "lucene_version"  :  "4.9"      },      "tagline"  :  "You  Know,  for  Search"  }  

Page 9: Elasticsearch po slovensky

KOMUNIKÁCIA

• HTTP metódy: GET, POST, PUT, DELETE

• formát: {METÓDA} /{index}/{type}/{id}

• JSON

Page 10: Elasticsearch po slovensky

PUT  /nervosa/podujatia/1  {      "title":  "WebElement",      "text":    "WebElement  je  pravidelné  stretnutie  ľudí  zaujímajúcich  sa  o  weby  a  technológie  s  webmi  spojené."  }

INSERT / UPDATE

{        "_index":  "nervosa",        "_type":  "podujatia",        "_id":  "1",        "_version":  1,        "created":  true  }

{        "_index":  "nervosa",        "_type":  "podujatia",        "_id":  "1",        "_version":  2,        "created":  false  }  

Page 11: Elasticsearch po slovensky

GET  /nervosa/podujatia/_search?q=weby

BASIC SEARCH

{        "took":  5,        "timed_out":  false,        "_shards":  {              "total":  5,              "successful":  5,              "failed":  0        },        "hits":  {              "total":  1,              "max_score":  0.076713204,              "hits":  [                    {                          "_index":  "nervosa",                          "_type":  "podujatia",                          "_id":  "1",                          "_score":  0.076713204,                          "_source":  {                                "title":  "WebElement",                                "text":  "WebElement  je  pravidelné  stretnutie  ľudí  zaujímajúcich  sa  o  weby  a  technológie  s  webmi  spojené."                          }                    }              ]        }  

Page 12: Elasticsearch po slovensky

GET  /nervosa/podujatia/_search?q=weby

BASIC SEARCH

{        "took":  5,        "timed_out":  false,        "_shards":  {              "total":  5,              "successful":  5,              "failed":  0        },        "hits":  {              "total":  1,              "max_score":  0.076713204,              "hits":  [                    {                          "_index":  "nervosa",                          "_type":  "podujatia",                          "_id":  "1",                          "_score":  0.076713204,                          "_source":  {                                "title":  "WebElement",                                "text":  "WebElement  je  pravidelné  stretnutie  ľudí  zaujímajúcich  sa  o  weby  a  technológie  s  webmi  spojené."                          }                    }              ]        }  

čas v ms

počet nájdených dokumentov

skóre/relevancia

Page 13: Elasticsearch po slovensky

GET  /nervosa/podujatia/_search?q={QUERY}

LUCENE QUERY PARSER

Terms apple

Phrases "apple iphone"

Proximity "apple safari"~5

Fuzzy apple~0.8

Wildcards app* *pp*

Boosting apple^10 safari

Range [2011/05/01 TO 2011/05/31] [java TO json]

Boolean apple AND NOT iphone +apple -iphone (apple OR iphone) AND NOT review

Fieldstitle:iphone^15 OR body:iphone published_on:[2011/05/01 TO

"2011/05/27 10:00:00"]

Page 14: Elasticsearch po slovensky

GET  /nervosa/podujatia/_search  {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }  }  

SEARCH using QUERY DSL

Page 15: Elasticsearch po slovensky

GET  /nervosa/podujatia/_search  {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }  }  

SEARCH using QUERY DSL

GET  /nervosa/podujatia/_search  {          "query":  {                  "match":  {                          "title":  "zdruzenie"                  }          }  }  

Page 16: Elasticsearch po slovensky

GET  /nervosa/podujatia/_search  {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }  }  

SEARCH using QUERY DSL

GET  /nervosa/podujatia/_search  {          "query":  {                  "match":  {                          "title":  "zdruzenie"                  }          }  }  

chýba diakritika

Page 17: Elasticsearch po slovensky

VYHĽADÁVANIE V ELASTIC

• každé pole {field} je vyhľadateľné • dva druhy vyhľadávania:

• structured search - filter“všetky podujatia v nervose za rok 2014”(výsledkom score je vždy 1)

• fulltext search - hľadá text “podujatia v nervose, kde sa rozoberal composer” vyráta score podľa relevancie*

Page 18: Elasticsearch po slovensky

INVERTED INDEX• “The quick brown fox jumped over the lazy dog” • “Quick brown foxes leap over lazy dogs in summer”Term            Doc_1    Doc_2  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  Quick      |              |    X  The          |      X      |  brown      |      X      |    X  dog          |      X      |  dogs        |              |    X  fox          |      X      |  foxes      |              |    X  in            |              |    X  jumped    |      X      |  lazy        |      X      |    X  leap        |              |    X  over        |      X      |    X  quick      |      X      |  summer    |              |    X  the          |      X      |  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐

?q=quick  brown  

Term            Doc_1    Doc_2  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  brown      |      X      |    X  quick      |      X      |  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  Total      |      2      |    1

Page 19: Elasticsearch po slovensky

VYHĽADÁVANIE V ELASTIC

získa pole {field} z dokumentu → zvolí jeho analyser → rozparsuje text do tokenov → aplikuje token filtre → uloží do indexu

Page 20: Elasticsearch po slovensky

ANALÝZACharacter filters → Tokenizer → Token filters

Page 21: Elasticsearch po slovensky

ANALÝZACharacter filters → Tokenizer → Token filters

• “upratať” text ešte pred tokenizáciou • napr. vyhodiť <html kód>

alebo transformovať & → and

Page 22: Elasticsearch po slovensky

ANALÝZACharacter filters → Tokenizer → Token filters

• “rozseká” text na výrazy, ktoré sa budú indexovať • standart tokenizer rozdelí text na výrazy

podľa word boundaries

"Set  the  shape  to  semi-­‐transparent  by  calling  set_trans(5)”  

set,  the,  shape,  to,  semi,  transparent,  by,  calling,    set_trans,  5

Page 23: Elasticsearch po slovensky

ANALÝZACharacter filters → Tokenizer → Token filters

• sa aplikuje na každý token a môže ho • zmeniť (lowercase, asciifolding) • zmazať (napr. stopwords “a”, “aj”, “že”…) • pridať ďaľšie tokeny (napr. synonymá)

#language  analyser  english  "Set  the  shape  to  semi-­‐transparent  by  calling  set_trans(5)”  

set,  shape,  semi,  transpar,  call,  set_tran,  5

Page 24: Elasticsearch po slovensky

KEDY SA ANALYZUJE

• pri indexovaní (na indexovaný text) • pri full-text vyhľadávaní (na hľadaný výraz) → väčšinou sa aplikuje ten istý analyzer (mal by sa)

• pri filtrovaní sa vyhľadáva presný výraz a analyzer sa neaplikuje

→ polia, ktoré budú používané na filtrovanie môžu mať nastavené "index": “not_analyzed" (napr. tagy)

Page 25: Elasticsearch po slovensky

MAPPING

• definovanie schémy • umožňuje presne určiť, ako sa má dané pole

správať • zadefinovať type (string/integer/double/

boolean/date) • určiť, či sa má/nemá pole analyzovať • aký analyzer použiť (pri indexovaní/vyhľadávaní)

Page 26: Elasticsearch po slovensky

MAPPING#  pred  zmenou  v  mappingu  treba  index  zavriet  alebo  zmazat    DELETE  /nervosa  

PUT  /nervosa  {      "mappings":  {          "podujatia"  :  {              "properties"  :  {                  "title"  :  {                      "type"  :        "string"                  },                  "datum"  :  {                      "type"  :      "date"                  },                  "text"  :  {                      "type"  :      "string",                      "analyzer":  "english"                  },                  "tags"  :  {                      "type"  :      "string",                      "index":      "not_analyzed"                  }              }          }      }  

Page 27: Elasticsearch po slovensky

A ČO TÁ SLOVENČINA?

Page 28: Elasticsearch po slovensky

A ČO TÁ SLOVENČINA?ElasticSearch nemá slovenský language analyzer

Page 29: Elasticsearch po slovensky

A ČO TÁ SLOVENČINA?ElasticSearch nemá slovenský language analyzer

Vytvoríme si ho sami

Page 30: Elasticsearch po slovensky

SCENÁR

• aby vyhľadávanie fungovalo s diakritikou aj bez • zmeniť velkosť slov na malé • vyhodiť spojky/predložky • vyhľadať aj slová v nie základnom tvare

(časované / skloňované ) • nájsť aj synonymá

Page 31: Elasticsearch po slovensky

SCENÁR

• aby vyhľadávanie fungovalo s diakritikou aj bez • zmeniť velkosť slov na malé • vyhodiť spojky/predložky • vyhľadať aj slová v nie základnom tvare

(časované / skloňované ) • nájsť aj synonymá

asciifolding

lowercasestopwords filter

stemmer lematizérsynonym filter

Page 32: Elasticsearch po slovensky

LEMATIZÉR

• použiť hunspell slovník • http://www.zdrojak.cz/clanky/elasticsearch-vyhledavame-cesky/ • https://github.com/essential-data/elasticsearch-sk • free

• LemmaGen • https://github.com/vhyza/elasticsearch-analysis-lemmagen • presnejšie, ale len na nekomerčné projekty

bin/plugin  -­‐-­‐url  http://bit.ly/analysis-­‐lemmagen  -­‐-­‐install  elasticsearch-­‐analysis-­‐lemmagen

Page 33: Elasticsearch po slovensky

DEFINÍCIA ANALYZERUPUT  /nervosa  {      "settings":  {          "analysis":  {              "filter":  {              "lemmagen_filter_sk":  {  

                   "type":  "lemmagen",                      "lexicon":  "sk"                  },                  "synonym_filter":  {                      "type":  "synonym",                      "synonyms_path":  "synonyms/sk_SK.txt",                      "ignore_case":  true                  },                  "stopwords_SK":  {                      "type":  "stop",                      "stopwords_path":  "stop-­‐words/stop-­‐words-­‐slovak.txt",                      "ignore_case":  true                  }              },  

Page 34: Elasticsearch po slovensky

DEFINÍCIA ANALYZERU(…)            "analyzer":  {                  "slovencina_synonym":  {                      "type":  "custom",                      "tokenizer":  "standard",                      "filter":  [                          "stopwords_SK",                          "lemmagen_filter_sk",                          "lowercase",                          "stopwords_SK",                          "synonym_filter",                          "asciifolding"                      ]                  },                  "slovencina":  {                      "type":  "custom",                      "tokenizer":  "standard",                      "filter":  [                          "stopwords_SK",                          "lemmagen_filter_sk",                          "lowercase",                          "stopwords_SK",                          "asciifolding"                      ]                  },  

Page 35: Elasticsearch po slovensky

SCHÉMAPUT  /nervosa/_mapping/podujatia  {          "podujatia"  :  {              "properties"  :  {                  "title"  :  {                      "type"  :        “string"                      "index_analyzer":  "slovencina",                      "search_analyzer":  "slovencina_synonym"                  },                  "datum"  :  {                      "type"  :      "date"                  },                  "text"  :  {                      "type"  :      "string",                      "analyzer":  "slovencina"                  },                  "tags"  :  {                      "type"  :      "string",                      "index":      "not_analyzed"                  }              }          }  

Page 36: Elasticsearch po slovensky

TEST ANALYZERAGET  /nervosa/_analyze?analyzer=slovencina  {  "WebElement  je  pravidelné  stretnutie  ľudí  zaujímajúcich  sa  o  weby  a  technológie  s  webmi  spojené."  }  

webelement,  pravidelny,  stretnutie,  ludia,  zaujimajuci,  zaujimajuci,  technologia,  web,  spojeny

Page 37: Elasticsearch po slovensky

VYHĽADÁVANIE 2GET  /nervosa/podujatia/_search  {          "query":  {                  "match":  {                          "text":  "zdruzenie"                  }          }  }  

Page 38: Elasticsearch po slovensky

VYHĽADÁVANIE 2{        "took":  1,        "timed_out":  false,        "_shards":  {              "total":  5,              "successful":  5,              "failed":  0        },        "hits":  {              "total":  1,              "max_score":  0.11506981,              "hits":  [                    {                          "_index":  "nervosa",                          "_type":  "podujatia",                          "_id":  "2",                          "_score":  0.11506981,                          "_source":  {                                "title":  "Rubyslava",                                "text":  "Neformálne  združenie  priateľov  elegantného  programovania  všeho  druhu.",                                "datum":  "2015-­‐04-­‐23"                          }                    }              ]        }  }

Page 39: Elasticsearch po slovensky

IMPLEMENTÁCIA PRE

WEBUMENIA

Page 40: Elasticsearch po slovensky
Page 41: Elasticsearch po slovensky

WEBUMENIA

Page 42: Elasticsearch po slovensky

ZDROJE a ODKAZY

• lab.SNG - Podpora slovenčiny pre ElasticSearchhttps://github.com/SlovakNationalGallery/elasticsearch-slovencina

• Elasticsearch: The Definitive Guide http://www.elastic.co/guide/en/elasticsearch/guide/current/index.html

• Ben Corlett’s Laracon EU talk on ElasticSearchhttps://laravel-news.com/2014/09/laracon-video-discovering-elasticsearch-laracon-eu/

• Lukáš Vlček - Elasticsearch: Vyhledáváme hezky česky http://www.zdrojak.cz/clanky/elasticsearch-vyhledavame-cesky/