SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
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
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"
}
}
}
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"
}
}
}
}
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
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
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/