Slide 1

Slide 1 text

David Padilla Elasticsearch

Slide 2

Slide 2 text

@dabit

Slide 3

Slide 3 text

Elasticsearch

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

SELECT * FROM properties;

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

SELECT * FROM properties WHERE bedrooms = 2;

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

SELECT * FROM properties WHERE bedrooms = 2 AND bathrooms = 2;

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

SELECT * FROM properties INNER JOIN tasks ON tasks.property_id = properties.id WHERE bedrooms = 2 AND bathrooms = 3 AND tasks.pending = true;

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

SELECT * FROM properties INNER JOIN tasks ON tasks.property_id = properties.id WHERE bedrooms = 2 AND bathrooms = 3 AND tasks.pending = true AND name LIKE ('%query%');

Slide 14

Slide 14 text

SELECT * FROM properties INNER JOIN tasks ON tasks.property_id = properties.id LEFT JOIN addresses ON addresses.id = property.id WHERE bedrooms = 2 AND bathrooms = 3 AND tasks.pending = true AND (name LIKE ('%query%') OR address.street LIKE('%query%') OR address.state LIKE ('%query%'));

Slide 15

Slide 15 text

Elasticsearch

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Java ew

Slide 18

Slide 18 text

Shay Banon

Slide 19

Slide 19 text

REST API Lucene

Slide 20

Slide 20 text

REST API Lucene Cliente Cliente Cliente

Slide 21

Slide 21 text

REST

Slide 22

Slide 22 text

GET POST PUT DELETE

Slide 23

Slide 23 text

Escalable

Slide 24

Slide 24 text

REST API Lucene REST API Lucene REST API Lucene REST API Lucene

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

Alta disponibilidad

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Índices Propiedades Documentos

Slide 29

Slide 29 text

Analogía con SQL Índices Propiedades Documentos Tablas Columnas Filas Tipos Base de datos

Slide 30

Slide 30 text

Schemaless

Slide 31

Slide 31 text

Crear un índice POST localhost:9200/sistemix

Slide 32

Slide 32 text

Crear un documento POST localhost:9200/sistemix/contacto { nombre: "Daniel Pliego", edad: 25, intereses: ["diseño"] }

Slide 33

Slide 33 text

POST sistemix/contacto { nombre: "Omaro Cancellara", edad: 30, intereses: ["angular", "rails"] } POST sistemix/contacto { nombre: "Alvaro Pereyra", edad: 25, intereses: ["node", "rails"] } POST sistemix/contacto { nombre: "Gloria Palma", edad: 20, intereses: ["angular", "cloud"] }

Slide 34

Slide 34 text

Búsquedas

Slide 35

Slide 35 text

GET sistemix/contacto/_search { query: { match: { nombre: "omaro" } } } match

Slide 36

Slide 36 text

{"hits": [{"_index":"sistemix","_type":"contacto","_id":"AUxX 2Y-xjmAhoUOInopz", “_score":0.8784157,"_source":{ nombre: "Omaro Cancellara", edad: 30, intereses: ["angular", "rails"] } }]}}

Slide 37

Slide 37 text

GET sistemix/contacto/_search { query: { term: { edad: 25 } } } term

Slide 38

Slide 38 text

hits: { { nombre: "Daniel Pliego", edad: 25, intereses: ["diseño"] } ,{ nombre: "Alvaro Pereyra", edad: 25, intereses: ["node", "rails"] } }

Slide 39

Slide 39 text

GET sistemix/contacto/_search { query: { term: { intereses: "rails" } } } term sobre arrays

Slide 40

Slide 40 text

hits: { { nombre: "Omaro Cancellara", edad: 30, intereses: ["angular", "rails"] }, { nombre: "Alvaro Pereyra", edad: 25, intereses: ["node", "rails"] } }

Slide 41

Slide 41 text

SELECT * FROM contacts INNER JOIN interests ON contact.id = interest.id WHERE interest.name = "rails";

Slide 42

Slide 42 text

Índice Invertido 1 2 3 4 5 6 7 daniel x pliego x omaro x cancellara x gloria x palma x alvaro x pereyra x

Slide 43

Slide 43 text

Tokenización Tokenize Char Filter Token Filter Limpiar caracteres no deseados Partir en tokens Limpiar tokens

Slide 44

Slide 44 text

Char filter El hierro es el amigo más honesto que puedes tener El hierro es el amigo mas honesto que puedes tener

Slide 45

Slide 45 text

Tokenize El hierro es el amigo mas honesto que puedes tener el hierro es el amigo mas honesto que puedes tener

Slide 46

Slide 46 text

Token Filter El hierro es el amigo mas honesto que puedes tener hierro amigo honesto puedes tener

Slide 47

Slide 47 text

Índice Invertido 1 2 hierro x honesto x amigo x puedes x tener x

Slide 48

Slide 48 text

Búsquedas Parciales

Slide 49

Slide 49 text

Poor man’s full text search WHERE nombre LIKE “oma*” WHERE nombre LIKE “dan*” WHERE nombre LIKE “*plie*”

Slide 50

Slide 50 text

N-Gram Tokenizer

Slide 51

Slide 51 text

Daniel dan dani daniel ani anie aniel nie niel

Slide 52

Slide 52 text

GET sistemix/contacto/_search { query: { match: { nombre: "dan" } } }

Slide 53

Slide 53 text

Índice Invertido 1 2 dan x dani x daniel x ani x anie x aniel x nie x niel x

Slide 54

Slide 54 text

Aggregations

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

GET sistemix/contacto/_search { query: { term: { intereses: "rails" } } } aggregations

Slide 57

Slide 57 text

aggregations GET sistemix/contacto/_search { query: { term: { intereses: "rails" } }, aggregations: { edades: { terms: { field: "edad" } } } }

Slide 58

Slide 58 text

{ nombre: "Omaro Cancellara", edad: 30, intereses: ["angular", "rails"] } },{ nombre: "Alvaro Pereyra", edad: 25, intereses: ["node", "rails"] } } }]}, "aggregations":{ "edades":{ "_type":"terms","missing":0,"total":2,"other":0, "terms": [ {"term":25,"count":1}, {"term":30,"count":1} ] } } }

Slide 59

Slide 59 text

aggregations GET sistemix/contacto/_search { query: { term: { intereses: "rails" } }, aggregations: { edades_promedio: { avg: { field: "edad" } } } }

Slide 60

Slide 60 text

{ nombre: "Omaro Cancellara", edad: 30, intereses: ["angular", "rails"] } },{ nombre: "Alvaro Pereyra", edad: 25, intereses: ["node", "rails"] } } }]}, "aggregations":{ “edades_promedio”:{ { “value”: 27.5 } } }

Slide 61

Slide 61 text

term average max min sum range date range

Slide 62

Slide 62 text

Búsqueda Espacial

Slide 63

Slide 63 text

{ "pin" : { "location" : { "lat" : 40.12, "lon" : -71.34 } } }

Slide 64

Slide 64 text

geo distance { "filtered" : { "query" : { "match_all" : {} }, "filter" : { "geo_distance" : { "distance" : "200km", "pin.location" : { "lat" : 40, "lon" : -70 } } } } }

Slide 65

Slide 65 text

200 km

Slide 66

Slide 66 text

{ "filtered" : { "query" : { "match_all" : {} }, "filter" : { "geo_bounding_box" : { "pin.location" : { "top_left" : { "lat" : 40.73, "lon" : -74.1 }, "bottom_right" : { "lat" : 40.01, "lon" : -71.12 } } } } } } geo bounding box

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

geo polygon { "filtered" : { "query" : { "match_all" : {} }, "filter" : { "geo_polygon" : { "person.location" : { "points" : [ {"lat" : 40, "lon" : -70}, {"lat" : 30, "lon" : -80}, {"lat" : 20, "lon" : -90} ] } } } } }

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

Conclusión

Slide 71

Slide 71 text

Fácil de usar

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

Fácil de configurar

Slide 74

Slide 74 text

##################### Elasticsearch Configuration Example ##################### # This file contains an overview of various configuration settings, # targeted at operations staff. Application developers should # consult the guide at . # # The installation procedure is covered at # . # # Elasticsearch comes with reasonable defaults for most settings, # so you can try it out without bothering with configuration. # # Most of the time, these defaults are just fine for running a production # cluster. If you're fine-tuning your cluster, or wondering about the # effect of certain configuration option, please _do ask_ on the # mailing list or IRC channel [http://elasticsearch.org/community]. # Any element in the configuration can be replaced with environment variables # by placing them in ${...} notation. For example: # #node.rack: ${RACK_ENV_VAR} # For information on supported formats and syntax for the config file, see # ################################### Cluster ################################### # Cluster name identifies your cluster for auto-discovery. If you're running # multiple clusters on the same network, make sure you're using unique names. # cluster.name: julian #################################### Node ##################################### # Node names are generated dynamically on startup, so you're relieved # from configuring them manually. You can tie this node to a specific name: # node.name: "Luna"

Slide 75

Slide 75 text

Moderno

Slide 76

Slide 76 text

Fin Fin

Slide 77

Slide 77 text

@dabit david @ easybroker.com

Slide 78

Slide 78 text

Desarrollo, Pizza y Cerveza 3er Jueves de cada mes http://www.meetup.com/ chilango-rails

Slide 79

Slide 79 text

No content