Download - Elasticsearch po slovensky
{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
Fieldstitle: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ÝZACharacter filters → Tokenizer → Token filters
ANALÝZACharacter filters → Tokenizer → Token filters
• “upratať” text ešte pred tokenizáciou • napr. vyhodiť <html kód>
alebo transformovať & → and
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
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
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
lowercasestopwords filter
stemmer lematizérsynonym 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 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 } },
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É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" } } }
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
VYHĽADÁVANIE 2GET /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
WEBUMENIA
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/