allegro.tech data science meetup #2: elasticsearch w praktyce
TRANSCRIPT
Elasticsearch w ekosystemie AllegroAndrzej Wisłowski, Paweł Bobruk
O nas:
zespół zajmujący się dostarczaniem zespołom
Elasticsearch jak usługę w Grupie Allegro
infrastruktura
konsultacje
szkolenia wewnętrzne
Agenda
Dlaczego elasticsearchTeoria wyszukiwania informacjiAgregacjePrzypadki użycia w AllegroInfrastruktura klastrów ELS w AllegroNowości w elasticsearch 2.0
Dlaczego elasticsearch
Real-Time data & analytics
System Rozproszony
Wyszukiwanie pełnotekstowe
Restowe API
Dokumenty JSONowe
Teoria wyszukiwania informacji
Wyszukiwanie informacji
Wyszukiwanie informacji (information retrivial) jest pozyskaniem istotnych dla szukającego informacji (zazwyczaj
dokumentów) z ze zbioru danych informatycznych (zazwyczaj
niestrukturalnych).
Odwrócony indeksDokument - element, na którym
budujemy system(np. produkt w sklepie, strona internetowa)
Term - element indeksu, zazwyczaj pojedyncze słowo zestaw termów tworzy słownik indeksu
Wyszukiwanie pełnotekstoweTerm Doc_1 Doc_2 Doc_3------------------------------------brown | X | X |dog | X | | dogs | | X | Xfox | X | | Xfoxes | | X |in | | X |jumped | X | | Xlazy | X | X |leap | | X |over | X | X | Xquick | X | X | Xsummer | | X |the | X | | X------------------------------------
Odwrócony index
Doc_1: The quick brown fox jumped over the lazy dogDoc_2: Quick brown foxes leap over lazy dogs in summerDoc_3: The quick fox jumped over dogs
Analizatory
Analizatory- Tokenizer
- whitespace - tokeny tylko po białych znakach
- standard - tokeny po białych znakach + znakach interpunkcji
- keyword - np. dla marek “Hugo Boss”
- regexp - własna definicja
- Token Filter
- lowercase
- stopword
- analiza języka polskiego
- stempel - stemer algorytmiczny
- hunspell for lucene - filtr oparty o słowniki i zasady gramatyki
- morfologik - analiza morfologiczna - polski projekt
Wyszukiwanie pełnotekstowe GET /my_index/_search
{ "query" : { "match" : { "body" : "brown" } }}
Term Doc_1 Doc_2 Doc_3------------------------------------brown | X | X | dog | X | | Xdogs | | X | Xfox | X | | Xfoxes | | X |in | | X |jumped | X | | Xlazy | X | X |leap | | X |over | X | X | Xquick | X | X | Xsummer | | X |the | X | | X------------------------------------
Odwrócony index
AgregacjeTerm Doc_1 Doc_2 Doc_3------------------------------------brown | X | X | dog | X | | Xdogs | | X | Xfox | X | | Xfoxes | | X |in | | X |jumped | X | | Xlazy | X | X |leap | | X |over | X | X | Xquick | X | X | Xsummer | | X |the | X | | X------------------------------------
Odwrócony index
GET /my_index/_search{ "query" : { "match" : { "body" : "brown" } }, "aggs" : { "popular_terms": { "terms" : { "field" : "body" } } }}
Field dataDoc Terms-----------------------------------------------------------------Doc_1 | brown, dog, fox, jumped, lazy, over, quick, theDoc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summerDoc_3 | dog, dogs, fox, jumped, over, quick, the-----------------------------------------------------------------
doc values - field data na dysku
Field dataDoc Terms-----------------------------------------------------------------Doc_1 | brown, dog, fox, jumped, lazy, over, quick, theDoc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summerDoc_3 | dog, dogs, fox, jumped, over, quick, the-----------------------------------------------------------------
GET /my_index/_search{ "query" : { "match" : { "body" : "brown" } }, "aggs" : { "popular_terms": { "terms" : { "field" : "body" } } }}
Term Doc_1 Doc_2 Doc_3------------------------------------brown | X | X | dog | X | | Xdogs | | X | X...-----------------------------------
{ "hits": { "total": 2, ... }, "aggregations": { "popular_terms": { "buckets": [ { "key": "brown", "doc_count": 2 }, { "key": "lazy", "doc_count": 2 }, { "key": "over", "doc_count": 2 }, { "key": "quick", "doc_count": 2 }, { "key": "dog", "doc_count": 1 }, ... ]}}}
Inverted index
Agregacje
Metricsminmaxsumavgvalue_countsum_of_squaresstd_deviationvariance
termsagregacja po polu
Najczęściej wyszukiwane słowa{
"aggs": { "mostCommonSearched": { "terms": { "field": "phrase" } } }}
{ "key": "samsung", "doc_count": 3321830 }, { "key": "galaxy", "doc_count": 2664985 }, { "key": "audi", "doc_count": 2343937 }, { "key": "nike", "doc_count": 2234019 }, ...
agregacjezagłębion
e
Najczęściej wyszukiwane per kategoria{ "aggs": {
"category": { "terms": { "field": "category", "size": 5 }, "aggs": { "mostCommonSearched": { "terms": { "field": "phrase", "size": 5 } } } } }}
Main Page Motoryzacja Książki i Komiksy Komputery Odzież, Obuwie, Dodatki
samsung audi testy lenovo nike
nike bmw historia tablet adidas
galaxy mercedes matematyka office buty
buty opel nauczyciela microsoft air
audi honda księga gtx sukienka
statscount, min, max, avg, sum
Statystyki cen per kategoria{ "aggs": {
"category": { "terms": { "field": "category", "size": 10 }, "aggs": { "stats": { "stats": { "field": "price" } } } }}
{ "key": "Oświetlenie/Lampy", "stats": { "count": 157452, "min": 1, "max": 66479, "avg": 297.42634631508975, "sum": 46830373.080003515 }},...
percentile
{ "key": "Oświetlenie/Lampy", "percentile": { "values": { "50.0": 162.65936064485723, "75.0": 330.90439138409306, "95.0": 980.0905118431161, "99.0": 2147.587473335171 } } }, ...
Ceny w percentylach per kategoria{
"aggs": {"category": {
"terms": { "field": "category.path",
"size": 10 }, "aggs": { "percentile": { "percentiles":
{ "field": "price", "percents": [ 50,
75,
95,
99 ] }
date_histogram
statystyka wg daty
Nowe produkty Sprzedawcy { "aggs": { "date": { "date_histogram": { "field": "createdAt", "interval": "month" } } }}
{
"key": “April”,
"doc_count": 13 }, {
"key": “May”,
"doc_count": 40 }, {
"key": “June”,
"doc_count": 28 }, ...
script
Koniec aukcji wg dni tygodnia{
"query": { "aggs": {
"auctionsPerWeekDay": { "terms": { "script": “doc['endDate'].date.dayOfWeek().getAsText()", } } }}
Niedziela 3672219
Sobota 3144495
Poniedziałek 3090514
Piątek 2823472
Środa 2729971
Czwartek 2724953
geo
Punkty odbioru w promieniu 1,5 km{
"aggs": { "byPlace": { "geo_distance": { "field": "location", "origin": "52.2401,21.0421", "ranges": [ { "to": 700}, {"from": 700, "to": 1000},
{"from": 1000, "to": 1500}
], "unit": "m" } } }}
{ "key": "*-700.0", "from": 0, "to": 700, "doc_count": 1 }, { "key": "700.0-1000.0", "from": 700, "to": 1000, "doc_count": 6 } , { "key": "1000.0-1500.0", "from": 1000, "to": 1500, "doc_count": 12 }
pipeline v 2.0
Pipeline
statystyczne (min, max, avg, ...)percentilecumulativemoving...
Moving
Elasticsearch w Allegro
Rekomendacje
Rekomendacje
- indeksowane są oferty allegro zawierające id meta produktu oraz ranking (score) oznaczający jakość oferty{ “name”: “iphone 6, super oferta” offerId: “23”, metaProductId: “p12”, score: 0,324}
- system rekomendacji wybiera meta produkty które mają być zarekomendowane użytkownikowi
Rekomendacje{ "aggregations": { "by_meta_product_id": { "buckets": [ { "key": "p12", "top_n_items": { "hits": { "total": 15, "max_score": null, "hits": [ { { "name": "iphone 6s" }, "sort": [ 0.1485 ] }, { { "name": "iphone 6s nowość", }, "sort": [ 0.1348 ] }, ... ]}}}]}}}
Problemy- optimize
- w Lucene zmiana dokumentu to usunięcie i dodanie nowego
- przy częstych zmianach indeksu, rośnie ilość skasowanych dokumentów, przy przekroczeniu pewnego progu - u nas 20% ma to wpływ na czasy odpowiedzi
- dlatego raz na dobę wymuszamy optimize indexu
Wydajność
- wielkość indeksu: 25 mln dokumentów
- odczyty > 3000 rps- czasy odpowiedzi : < 500ms (p99)Skalujemy odczyty przez większą liczbę replik.
http://hermes.allegro.tech/
https://github.com/allegro/hermes
Hermeswykorzystanie do audytów “eventów”, zapisywane
są wysłane i opublikowane “eventy”
wydajne zapisy ponad 4000 rps
indeksy timeseries (per dzień), łatowść kasowania
około 1,8 mld dokumentów
zapisy bulkami
DWH
- KIBANA - analityczne - biznes potrafi używać
- marketing / reklama
- 4 mld dokumentów
- 2000 indeksów
- indeksy timeseries z użyciem aliasów
Bilingi
Billingi serwisów allegro
około 400 mln dokumentów
indeksowań 100 rps
użycie timeseries i aliasów
routing po użytkowniku
Punkty odbioru - GEO
wyszukiwanie geolokalizacyjne
Setup klastrów
Setup cloudowy
prywatny cloud oparty na openstacku
ansible do automatyzacji stawiania klastrów (łatwe rozszerzanie)
backupy na hdfsa - rozszerzyliśmy o autoryzację kerberos
monitoring oparty na graphite, cabot i pagerduty
Narzędzie do reindeksacji
https://github.com/allegro/elasticsearch-reindex-tool
Nowości w elasticsearch 2.0
Elasticsearch 2.0
Agregacje Pipeline
uproszczone query API - (filtry zmergowane w query)
konfigurowalne kompresowanie (LZ4, DEFLATE)
doc-values - domyślne
Shield na poziomie pól i dokumentów (płatny)
Marvel opensoursed
Sense opensourced
Pytania