SlideShare a Scribd company logo
Elasticsearch w
ekosystemie Allegro
Andrzej 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 elasticsearch
Teoria wyszukiwania informacji
Agregacje
Przypadki użycia w Allegro
Infrastruktura klastrów ELS w Allegro
Nowości w elasticsearch 2.0
Dlaczego
elasticsearch
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
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 indeks
Dokument - 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łnotekstowe
Term Doc_1 Doc_2 Doc_3
------------------------------------
brown | X | X |
dog | X | |
dogs | | X | X
fox | X | | X
foxes | | X |
in | | X |
jumped | X | | X
lazy | X | X |
leap | | X |
over | X | X | X
quick | X | X | X
summer | | X |
the | X | | X
------------------------------------
Odwrócony index
Doc_1: The quick brown fox jumped over the lazy dog
Doc_2: Quick brown foxes leap over lazy dogs in summer
Doc_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
Wyszukiwanie pełnotekstowe
GET /my_index/_search
{
"query" : {
"match" : {
"body" : "brown"
}
}
}
Term Doc_1 Doc_2 Doc_3
------------------------------------
brown | X | X |
dog | X | | X
dogs | | X | X
fox | X | | X
foxes | | X |
in | | X |
jumped | X | | X
lazy | X | X |
leap | | X |
over | X | X | X
quick | X | X | X
summer | | X |
the | X | | X
------------------------------------
Odwrócony index
Agregacje
Term Doc_1 Doc_2 Doc_3
------------------------------------
brown | X | X |
dog | X | | X
dogs | | X | X
fox | X | | X
foxes | | X |
in | | X |
jumped | X | | X
lazy | X | X |
leap | | X |
over | X | X | X
quick | X | X | X
summer | | X |
the | X | | X
------------------------------------
Odwrócony index
GET /my_index/_search
{
"query" : {
"match" : {
"body" : "brown"
}
},
"aggs" : {
"popular_terms": {
"terms" : {
"field" : "body"
}
}
}
}
Field data
Doc Terms
-----------------------------------------------------------------
Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
Doc_3 | dog, dogs, fox, jumped, over, quick, the
-----------------------------------------------------------------
doc values - field data na dysku
Field data
Doc Terms
-----------------------------------------------------------------
Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
Doc_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 | | X
dogs | | 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
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
Metrics
min
max
sum
avg
value_count
sum_of_squares
std_deviation
variance
terms
agregacja 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
},
...
agregacje
zagłębione
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
stats
count, 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
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
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
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
Pipeline
statystyczne (min, max, avg, ...)
percentile
cumulative
moving
...
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
Hermes
wykorzystanie 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

More Related Content

PDF
Elasticsearch - logi i metryki
PDF
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
PPT
SphinxSearch
ODP
Elasticsearch nie tylko dla Wielkodanowców
PDF
JDD2015: Lucene - od wyszukiwarki po analizę danych - Zbyszko Papierski
PDF
Ocena efektywności wyszukiwania informacji w Internecie
PDF
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
PDF
Scaling infrastructure beyond containers
Elasticsearch - logi i metryki
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
SphinxSearch
Elasticsearch nie tylko dla Wielkodanowców
JDD2015: Lucene - od wyszukiwarki po analizę danych - Zbyszko Papierski
Ocena efektywności wyszukiwania informacji w Internecie
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
Scaling infrastructure beyond containers

More from allegro.tech (7)

PDF
Confitura 2015 - Code Quality Keepers @ Allegro
PDF
Confitura 2015 - Mikrousługi nie lubią być samotne
PDF
RxJava & Hystrix - Perfect match for distributed applications
PDF
Microservices architecture pitfalls
PDF
RxJava - introduction & design
PDF
JDD 2014: Adam Dubiel - Import allegro.tech.internal.*
PDF
Fighting with scale
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Mikrousługi nie lubią być samotne
RxJava & Hystrix - Perfect match for distributed applications
Microservices architecture pitfalls
RxJava - introduction & design
JDD 2014: Adam Dubiel - Import allegro.tech.internal.*
Fighting with scale
Ad

allegro.tech Data Science Meetup #2: Elasticsearch w praktyce

Editor's Notes

  • #3: dostarczanie infrastrukury konsultacje szkolenia
  • #9: ten obrazek do zmiany na inny
  • #11: czy screenshot z sensa, curl np. jak w slajdzie analyze api: !jeden slajd. (Nie ma narzuconej schemy)! Format Json
  • #43: X
  • #44: X
  • #53: Elasitcsearch skaluje zapis przez zwiększenie ilości shardów.
  • #60: zmienić font
  • #61: nody hot i cold; przeglądarkowy klient - sense!