Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Elasticsearch po slovensky

2,656 views

Published on

Presentation for WebElement #33

Elasticsearch is one of the most popular search engines. Used by companies like Github, Stack Overflow, Wikipedia, ...

It's schema-free, scales horizontally and allows almost real-time searching. All of that with simple installation and integration to your project.

Also provides full-text search and works with synonyms and stop-words.

...If your primary language is English...

How to make it work and get relevant search results with Slovak language.

Published in: Technology
  • Be the first to comment

Elasticsearch po slovensky

  1. 1. {po slovensky}. Igor Rjabinin {lab.SNG} elastic{search}.
  2. 2. –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.
  3. 3. 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
  4. 4. 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/
  5. 5. 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
  6. 6. SQL vs elasticsearch database → table → row index → type → document
  7. 7. 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  
  8. 8. 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"   }  
  9. 9. KOMUNIKÁCIA • HTTP metódy: GET, POST, PUT, DELETE • formát: 
 {METÓDA} /{index}/{type}/{id} • JSON
  10. 10. 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   }  
  11. 11. 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é."                          }                    }              ]        }  
  12. 12. 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
  13. 13. 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 Fields title:iphone^15 OR body:iphone published_on:[2011/05/01 TO "2011/05/27 10:00:00"]
  14. 14. GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }   }   SEARCH using QUERY DSL
  15. 15. GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }   }   SEARCH using QUERY DSL GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "zdruzenie"                  }          }   }  
  16. 16. GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }   }   SEARCH using QUERY DSL GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "zdruzenie"                  }          }   }   chýba diakritika
  17. 17. 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*
  18. 18. 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
  19. 19. VYHĽADÁVANIE V ELASTIC získa pole {field} z dokumentu → zvolí jeho analyser → rozparsuje text do tokenov → aplikuje token filtre → uloží do indexu
  20. 20. ANALÝZA Character filters → Tokenizer → Token filters
  21. 21. ANALÝZA Character filters → Tokenizer → Token filters • “upratať” text ešte pred tokenizáciou • napr. vyhodiť <html kód> 
 alebo transformovať & → and
  22. 22. ANALÝZA Character 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
  23. 23. ANALÝZA Character 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
  24. 24. 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)
  25. 25. 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í)
  26. 26. 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"                  }              }          }      }  
  27. 27. A ČO TÁ SLOVENČINA?
  28. 28. A ČO TÁ SLOVENČINA? ElasticSearch nemá slovenský language analyzer
  29. 29. A ČO TÁ SLOVENČINA? ElasticSearch nemá slovenský language analyzer Vytvoríme si ho sami
  30. 30. 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á
  31. 31. 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 lowercase stopwords filter stemmer lematizér synonym filter
  32. 32. 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
  33. 33. DEFINÍCIA ANALYZERU PUT  /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                  }              },  
  34. 34. 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"                      ]                  },  
  35. 35. SCHÉMA PUT  /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"                  }              }          }  
  36. 36. TEST ANALYZERA GET  /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
  37. 37. VYHĽADÁVANIE 2 GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "text":  "zdruzenie"                  }          }   }  
  38. 38. 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"                          }                    }              ]        }   }
  39. 39. IMPLEMENTÁCIA PRE WEBUMENIA
  40. 40. WEBUMENIA
  41. 41. ZDROJE a ODKAZY • lab.SNG - Podpora slovenčiny pre ElasticSearch
 https://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 ElasticSearch
 https://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/

×