SlideShare a Scribd company logo
{po slovensky}.
Igor Rjabinin {lab.SNG}
elastic{search}.
–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.
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
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/
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
SQL vs elasticsearch
database → table → row
index → type → document
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	
  
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"	
  
}	
  
KOMUNIKÁCIA
• HTTP metódy: GET, POST, PUT, DELETE
• formát: 

{METÓDA} /{index}/{type}/{id}
• JSON
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	
  
}	
  
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é."	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  }	
  
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
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"]
GET	
  /nervosa/podujatia/_search	
  
{	
  
	
  	
  	
  	
  "query":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "match":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "title":	
  "webelement"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
SEARCH using QUERY DSL
GET	
  /nervosa/podujatia/_search	
  
{	
  
	
  	
  	
  	
  "query":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "match":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "title":	
  "webelement"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
SEARCH using QUERY DSL
GET	
  /nervosa/podujatia/_search	
  
{	
  
	
  	
  	
  	
  "query":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "match":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "title":	
  "zdruzenie"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
GET	
  /nervosa/podujatia/_search	
  
{	
  
	
  	
  	
  	
  "query":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "match":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "title":	
  "webelement"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
SEARCH using QUERY DSL
GET	
  /nervosa/podujatia/_search	
  
{	
  
	
  	
  	
  	
  "query":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "match":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "title":	
  "zdruzenie"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
chýba diakritika
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*
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
VYHĽADÁVANIE V ELASTIC
získa pole {field} z dokumentu → zvolí jeho
analyser → rozparsuje text do tokenov →
aplikuje token filtre → uloží do indexu
ANALÝZA
Character filters → Tokenizer → Token filters
ANALÝZA
Character filters → Tokenizer → Token filters
• “upratať” text ešte pred tokenizáciou
• napr. vyhodiť <html kód> 

alebo transformovať & → and
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
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
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)
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í)
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"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
	
  	
  }	
  
A ČO TÁ SLOVENČINA?
A ČO TÁ SLOVENČINA?
ElasticSearch nemá slovenský language analyzer
A ČO TÁ SLOVENČINA?
ElasticSearch nemá slovenský language analyzer
Vytvoríme si ho sami
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á
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
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
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	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  },	
  
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"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  	
  	
  	
  	
  },	
  
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"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
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
VYHĽADÁVANIE 2
GET	
  /nervosa/podujatia/_search	
  
{	
  
	
  	
  	
  	
  "query":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "match":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "text":	
  "zdruzenie"	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
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"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  }	
  
}
IMPLEMENTÁCIA PRE
WEBUMENIA
Elasticsearch po slovensky
WEBUMENIA
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/

More Related Content

PDF
Search Analytics with ELK (Elastic Stack)
PDF
Jak se dělal nový Skrz.cz na Symfony a Elasticsearch
PPTX
SEO V DOBE UMELEJ INTELIGENCIE A DÁT
PPTX
Web of Knowledge
PDF
Analytika
PDF
Zaverecna uloha KPI
PDF
Vyhľadávanie v databázach akademickej knižnice UK
PDF
Spracovanie velkych dat MONOGRAM Tech Monday 27.07.2011
Search Analytics with ELK (Elastic Stack)
Jak se dělal nový Skrz.cz na Symfony a Elasticsearch
SEO V DOBE UMELEJ INTELIGENCIE A DÁT
Web of Knowledge
Analytika
Zaverecna uloha KPI
Vyhľadávanie v databázach akademickej knižnice UK
Spracovanie velkych dat MONOGRAM Tech Monday 27.07.2011

Similar to Elasticsearch po slovensky (11)

PPTX
DAWINCI / Ján Grman
PPTX
Infos 2011Analýza vzorov návrhov interfejsu vyhľadávania
PPT
Seminar Kpi 2008 - Dorucovanie Multimedialneho Obsahu
PPTX
Data SAMSARA and citizen participation
PDF
Ako efektívne googliť
PPTX
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...
ODP
Selenium prezentácia pre Webelement
PDF
Diploma thesis: Virtual laboratory using JavaScript on the server side
PDF
Datanest 3.0
PPTX
test automation technologies and using kafka
PDF
World Usability Day 2014 Slovakia - Mária Bieliková, FIIT STU - UX Lab & Class
DAWINCI / Ján Grman
Infos 2011Analýza vzorov návrhov interfejsu vyhľadávania
Seminar Kpi 2008 - Dorucovanie Multimedialneho Obsahu
Data SAMSARA and citizen participation
Ako efektívne googliť
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...
Selenium prezentácia pre Webelement
Diploma thesis: Virtual laboratory using JavaScript on the server side
Datanest 3.0
test automation technologies and using kafka
World Usability Day 2014 Slovakia - Mária Bieliková, FIIT STU - UX Lab & Class
Ad

More from lab_SNG (14)

PPTX
Open data: tactics / Museum Connections Paris 2020
PPTX
WHAT'S NEXT? V umení
PDF
Keep Things Simple @ Dortmunder U
PPTX
Future Proofing the Museum Digital infrastructure
PPTX
Múzejné zbierky online: Prečo sú voľne dostupné dáta dôležité?
PPTX
Web sen x skutočnosť – udalosti slovenského štátu v 4 kapitolách
PPTX
From Slovakia to Norway: Art, collections and data across borders
PDF
SmartCafe - Art & Data Hacking
PPTX
Prvý rok nového Webu umenia
PPTX
Art Data Hackathon - The Mirror project
PDF
Art Data Hackathon - Klima iOS app
PPTX
Magnus Bognerud - Current digital collection management projects at nasjonalm...
PPTX
Dag Hensten - Nasjonalmuseet collections online
PDF
Igor Rjabinin - Webumenia.sk
Open data: tactics / Museum Connections Paris 2020
WHAT'S NEXT? V umení
Keep Things Simple @ Dortmunder U
Future Proofing the Museum Digital infrastructure
Múzejné zbierky online: Prečo sú voľne dostupné dáta dôležité?
Web sen x skutočnosť – udalosti slovenského štátu v 4 kapitolách
From Slovakia to Norway: Art, collections and data across borders
SmartCafe - Art & Data Hacking
Prvý rok nového Webu umenia
Art Data Hackathon - The Mirror project
Art Data Hackathon - Klima iOS app
Magnus Bognerud - Current digital collection management projects at nasjonalm...
Dag Hensten - Nasjonalmuseet collections online
Igor Rjabinin - Webumenia.sk
Ad

Elasticsearch po slovensky

  • 1. {po slovensky}. Igor Rjabinin {lab.SNG} elastic{search}.
  • 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. 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. 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. 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. SQL vs elasticsearch database → table → row index → type → document
  • 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. 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. KOMUNIKÁCIA • HTTP metódy: GET, POST, PUT, DELETE • formát: 
 {METÓDA} /{index}/{type}/{id} • JSON
  • 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. 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. 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. 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. GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }   }   SEARCH using QUERY DSL
  • 15. GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "webelement"                  }          }   }   SEARCH using QUERY DSL GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "title":  "zdruzenie"                  }          }   }  
  • 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. 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. 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. 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. ANALÝZA Character filters → Tokenizer → Token filters
  • 21. ANALÝZA Character filters → Tokenizer → Token filters • “upratať” text ešte pred tokenizáciou • napr. vyhodiť <html kód> 
 alebo transformovať & → and
  • 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. 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. 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. 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. 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. A ČO TÁ SLOVENČINA?
  • 28. A ČO TÁ SLOVENČINA? ElasticSearch nemá slovenský language analyzer
  • 29. A ČO TÁ SLOVENČINA? ElasticSearch nemá slovenský language analyzer Vytvoríme si ho sami
  • 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. 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. 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. 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. 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. 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. 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. VYHĽADÁVANIE 2 GET  /nervosa/podujatia/_search   {          "query":  {                  "match":  {                          "text":  "zdruzenie"                  }          }   }  
  • 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"                          }                    }              ]        }   }
  • 42. 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/