Successfully reported this slideshow.

Elasticsearch po slovensky

1

Share

Loading in …3
×
1 of 42
1 of 42

Elasticsearch po slovensky

1

Share

Download to read offline

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.

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.

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

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/

×