Slide 1

Slide 1 text

Elasticsearch in action By Thijs Feryn

Slide 2

Slide 2 text

This is my 135th talk

Slide 3

Slide 3 text

2010

Slide 4

Slide 4 text

2011

Slide 5

Slide 5 text

2012

Slide 6

Slide 6 text

Thank you

Slide 7

Slide 7 text

Explain in 1 slide

Slide 8

Slide 8 text

•Full-text search database •NoSQL database •Analytics engine •Written in Java •Lucene based ( ~Solr) •Inverted indices •Easy to scale (~Elastic) •RESTFul interface (HTTP/JSON) •Schemaless •Real-time •ELK stack

Slide 9

Slide 9 text

Still with me?

Slide 10

Slide 10 text

Hi, I’m Thijs

Slide 11

Slide 11 text

I’m @ThijsFeryn on Twitter

Slide 12

Slide 12 text

I’m an Evangelist At

Slide 13

Slide 13 text

I’m a at board member

Slide 14

Slide 14 text

CFP open until October 14th

Slide 15

Slide 15 text

https://joind.in/talk/view/15442 I need feedback

Slide 16

Slide 16 text

https://www.elastic.co/ downloads/elasticsearch

Slide 17

Slide 17 text

{      "status"  :  200,      "name"  :  "War  V",      "cluster_name"  :  "elasticsearch",      "version"  :  {          "number"  :  "1.5.2",          "build_hash"  :   "62ff9868b4c8a0c45860bebb259e21980778ab1c",          "build_timestamp"  :  "2015-­‐04-­‐27T09:21:06Z",          "build_snapshot"  :  false,          "lucene_version"  :  "4.10.4"      },      "tagline"  :  "You  Know,  for  Search"   } http://localhost:9200

Slide 18

Slide 18 text

RDBMS Elasticsearch Database Table Row Index Type Document

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

POST  /my-­‐index   {"acknowledged":true}   POST/my-­‐index/my-­‐type   {      "key"  :  "value",      "date"  :  "2015-­‐05-­‐10",      "counter"  :  1,      "tags"  :  ["tag1","tag2","tag3"]   }   {        "_index":  "my-­‐index",        "_type":  "my-­‐type",        "_id":  "AU089olr9oI99a_rK9fi",        "_version":  1,        "created":  true   } CREATE  DATABASE  my-­‐index INSERT  INTO  my-­‐index.my-­‐type  (key,date,counter,tags)     VALUES  ("value","2015-­‐05-­‐10",1,"tag1,tag2,tag3") Confirmation

Slide 21

Slide 21 text

GET/my-­‐index/my-­‐type/AU089olr9oI99a_rK9fi?pretty   {        "_index":  "my-­‐index",        "_type":  "my-­‐type",        "_id":  "AU089olr9oI99a_rK9fi",        "_version":  1,        "found":  true,        "_source":  {              "key":  "value",              "date":  "2015-­‐05-­‐10",              "counter":  1,              "tags":  [                    "tag1",                    "tag2",                    "tag3"              ]        }   } Retrieve document by id Document & meta data SELECT  *     FROM  my-­‐index.my-­‐type   WHERE   id="AU089olr9oI99a_rK9fi"

Slide 22

Slide 22 text

GET  /my-­‐index/_mapping?pretty   {        "my-­‐index":  {              "mappings":  {                    "my-­‐type":  {                          "properties":  {                                "counter":  {                                      "type":  "long"                                },                                "date":  {                                      "type":  "date",                                      "format":  "dateOptionalTime"                                },                                "key":  {                                      "type":  "string"                                },                                "tags":  {                                      "type":  "string"                                }                          }                    }              }        }   } Schemaless? Not really … “Guesses” mapping on insert

Slide 23

Slide 23 text

Explicit mapping … using actual data

Slide 24

Slide 24 text

mysql>  desc  catalog_product_flat_1;   +-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐+   |  Field                                                    |  Type                                  |  Null  |  Key  |  Default  |  Extra  |   +-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐+   |  entity_id                                            |  int(10)  unsigned          |  NO      |  PRI  |  NULL        |              |   |  attribute_set_id                              |  smallint(5)  unsigned  |  NO      |  MUL  |  0              |              |   |  type_id                                                |  varchar(32)                    |  NO      |  MUL  |  simple    |              |   |  allow_open_amount                            |  int(11)                            |  YES    |          |  NULL        |              |   |  cost                                                      |  decimal(12,4)                |  YES    |          |  NULL        |              |   |  created_at                                          |  timestamp                        |  YES    |          |  NULL        |              |   |  email_template                                  |  varchar(255)                  |  YES    |          |  NULL        |              |   |  enable_googlecheckout                    |  smallint(6)                    |  YES    |          |  NULL        |              |   |  giftcard_amounts                              |  decimal(12,4)                |  YES    |          |  NULL        |              |   |  giftcard_type                                    |  smallint(5)  unsigned  |  YES    |          |  NULL        |              |   |  gift_message_available                  |  smallint(6)                    |  YES    |          |  NULL        |              |   |  gift_wrapping_available                |  smallint(6)                    |  YES    |          |  NULL        |              |   |  gift_wrapping_price                        |  decimal(12,4)                |  YES    |          |  NULL        |              |   |  has_options                                        |  smallint(6)                    |  NO      |          |  0              |              |   |  image_label                                        |  varchar(255)                  |  YES    |          |  NULL        |              |   |  is_recurring                                      |  smallint(6)                    |  YES    |          |  NULL        |              |   |  is_redeemable                                    |  int(11)                            |  YES    |          |  NULL        |              |   |  lifetime                                              |  int(11)                            |  YES    |          |  NULL        |              |   |  links_exist                                        |  int(11)                            |  YES    |          |  NULL        |              |   |  links_purchased_separately          |  int(11)                            |  YES    |          |  NULL        |              |   |  links_title                                        |  varchar(255)                  |  YES    |          |  NULL        |              |   |  msrp                                                      |  decimal(12,4)                |  YES    |          |  NULL        |              |   |  msrp_display_actual_price_type  |  varchar(255)                  |  YES    |          |  NULL        |              |   |  msrp_enabled                                      |  smallint(6)                    |  YES    |          |  NULL        |              |   |  name                                                      |  varchar(255)                  |  YES    |  MUL  |  NULL        |              |   |  news_from_date                                  |  datetime                          |  YES    |          |  NULL        |              |   |  news_to_date                                      |  datetime                          |  YES    |          |  NULL        |              |   |  open_amount_max                                |  decimal(12,4)                |  YES    |          |  NULL        |              |   |  open_amount_min                                |  decimal(12,4)                |  YES    |          |  NULL        |              |   |  price                                                    |  decimal(12,4)                |  YES    |  MUL  |  NULL        |              |   |  price_type                                          |  int(11)                            |  YES    |          |  NULL        |              |   |  price_view                                          |  int(11)                            |  YES    |          |  NULL        |              |   |  recurring_profile                            |  text                                  |  YES    |          |  NULL        |              |   |  required_options                              |  smallint(5)  unsigned  |  NO      |          |  0              |              |   |  shipment_type                                    |  int(11)                            |  YES    |          |  NULL        |              |   |  short_description                            |  text                                  |  YES    |          |  NULL        |              |   |  sku                                                        |  varchar(64)                    |  YES    |          |  NULL        |              |   |  sku_type                                              |  int(11)                            |  YES    |          |  NULL        |              |   |  small_image                                        |  varchar(255)                  |  YES    |          |  NULL        |              |   |  small_image_label                            |  varchar(255)                  |  YES    |          |  NULL        |              |   Magento’s flattened product table

Slide 25

Slide 25 text

Import data from MySQL to ElasticSearch

Slide 26

Slide 26 text

{          "category":  [                  "Default  Category",                  "Men",                  "Shirts"          ],          "entity_id":  "231",          "created_at":  "2013-­‐03-­‐05  06:48:12",          "updated_at":  "2013-­‐03-­‐05  09:27:15",          "name":  "French  Cuff  Cotton  Twill  Oxford",          "price":  "190.0000",          "description":  "Made  with  wrinkle  resistant  cotton  twill,  this  French-­‐cuffed   luxury  dress  shirt  is  perfect  for  Business  Class  frequent  flyers.",          "sku":  "msj000"   } SELECT  GROUP_CONCAT(distinct  c.name)  as  category,p.entity_id,  p.created_at,   p.updated_at,  p.name,  p.price,  p.short_description  as  description,p.sku     FROM  catalog_product_flat_1    p   JOIN  `catalog_category_product_index`  AS  `cat_index`  ON   cat_index.product_id=p.entity_id   JOIN  `catalog_category_flat_store_1`  AS  `c`  ON   cat_index.category_id=c.entity_id   WHERE  cat_index.store_id  =  1  AND  cat_index.visibility=1   GROUP  BY  p.name   ORDER  BY  p.entity_id

Slide 27

Slide 27 text

POST  /products   {          "mappings":  {                  "product"  :  {                          "_id"  :  {                                  "path"  :  "entity_id"                          },                          "properties"  :  {                                  "entity_id"  :  {"type"  :  "integer"},                                  "name"  :  {                                          "type"  :  "string",                                            "index"  :  "not_analyzed",                                          "fields"  :  {                                                  "raw"  :  {                                                          "type"  :  "string",                                                          "analyzer":  "english"                                                  }                                          }                                  },                                  "description"  :  {                                          "type"  :  "string",                                            "index"  :  "not_analyzed",                                          "fields"  :  {                                                  "raw"  :  {                                                          "type"  :  "string",                                                          "analyzer":  "english"                                                  }                                          }                                  },                                  "price"  :  {"type"  :  "double"},                                  "sku"  :  {"type"  :  "string",  "index"  :  "not_analyzed"},                                  "created_at"  :  {"type"  :  "date",  "format"  :  "YYYY-­‐MM-­‐dd  HH:mm:ss"},                                  "updated_at"  :  {"type"  :  "date",  "format"  :  "YYYY-­‐MM-­‐dd  HH:mm:ss"}  ,                                  "category"  :  {                                          "type"  :  "string",                                          "index"  :  "not_analyzed"                                  }                                                        }                  }          }   } Explicit mapping at index creation time

Slide 28

Slide 28 text

     "entity_id"  :  {"type"  :  "integer"},        "name"  :  {                "type"  :  "string",                  "index"  :  "not_analyzed",                "fields"  :  {                        "raw"  :  {                                "type"  :  "string",                                "analyzer":  "english"                        }                }        },        "description"  :  {                "type"  :  "string",                  "index"  :  "not_analyzed",                "fields"  :  {                        "raw"  :  {                                "type"  :  "string",                                "analyzer":  "english"                        }                }        },        "price"  :  {"type"  :  "double"},        "sku"  :  {"type"  :  "string",  "index"  :  "not_analyzed"},        "created_at"  :  {"type"  :  "date",  "format"  :  "YYYY-­‐MM-­‐dd  HH:mm:ss"},        "updated_at"  :  {"type"  :  "date",  "format"  :  "YYYY-­‐MM-­‐dd  HH:mm:ss"}  ,        "category"  :  {                "type"  :  "string",                "index"  :  "not_analyzed"        }                                 Not analyzed? English analyzer?

Slide 29

Slide 29 text

Analyzed vs non-analyzed

Slide 30

Slide 30 text

Full-text vs exact value

Slide 31

Slide 31 text

Analyzer •Character filters •Tokenizers •Token filters Replaces characters for analyzed text Break text down into terms Add/modify/ delete tokens

Slide 32

Slide 32 text

Built-in analyzers •Standard •Simple •Whitespace •Stop •Keyword •Pattern •Language •Snowball •Custom Standard tokenizer Lowercase token filter English stop word token filter

Slide 33

Slide 33 text

Set the shape to semi-transparent by calling set_trans(5) set, the, shape, to, semi, transparent, by, calling, set_trans, 5 set, the, shape, to, semi, transparent, by, calling, set, trans Set, the, shape, to, semi-transparent, by, calling, set_trans(5) set, shape, semi, transpar, call, set_tran, 5 Standard Simple Whitespace English

Slide 34

Slide 34 text

Building a custom analyzer PUT  /my_index   {      "settings":  {          "analysis":  {              "char_filter":  {                  "&_to_and":  {                      "type":  "mapping",                      "mappings":  [  "&=>  and  "]                  }},              "filter":  {                  "my_stopwords":  {                      "type":  "stop",                      "stopwords":  [  "the",  "a"  ]                  }},                  "analyzer":  {                      "my_analyzer":  {                          "type":  "custom",                          "char_filter":    [  "html_strip",  "&_to_and"  ],                          "tokenizer":  "standard",                          "filter":  [  "lowercase",  "my_stopwords"  ]                          }}   }}}

Slide 35

Slide 35 text

Search

Slide 36

Slide 36 text

GET  /products/product/_search?pretty   {        "took":  2,        "timed_out":  false,        "_shards":  {              "total":  1,              "successful":  1,              "failed":  0        },        "hits":  {              "total":  192,              "max_score":  1,              "hits":  [                    {                          "_index":  "products",                          "_type":  "product",                          "_id":  "231",                          "_score":  1,                          "_source":  {                                "category":  [                                      "Default  Category",                                      "Men",                                      "Shirts"                                ],                                "entity_id":  "231",                                "created_at":  "2013-­‐03-­‐05  06:48:12",                                "updated_at":  "2013-­‐03-­‐05  09:27:15",                                "name":  "French  Cuff  Cotton  Twill  Oxford",                                "price":  "190.0000",                                "description":  "Made  with  wrinkle  resistant  cotton   twill,  this  French-­‐cuffed  luxury  dress  shirt  is  perfect  for  Business   Class  frequent  flyers.",                                "sku":  "msj000"                          }                    },   … SELECT  *  FROM   products.product  

Slide 37

Slide 37 text

GET  /products/product/_search?pretty   POST  /products/product/_search?pretty   {            "query":  {          "match_all":  {}      }   }   Search “lite” vs full query DSL SELECT  *  FROM   products.product  

Slide 38

Slide 38 text

GET  /products/product/_search? pretty&q=name.raw:Blazer   POST  /products/product/_search?pretty   {      "query":  {          "match":  {              "name.raw":  "Blazer"          }      }   }   SELECT  *  FROM   products.product     WHERE     name  LIKE  "%Blazer%" Search “lite” vs full query DSL

Slide 39

Slide 39 text

SELECT  *  FROM   products.product     WHERE     name  =  "Linen  Blazer" POST  /products/product/_search? pretty   {      "query":  {          "match":  {              "name.raw":  "Linen  Blazer"          }      }   }   POST  /products/product/_search? pretty   {      "query":  {          "filtered":  {              "query":  {                  "match_all":  {}              },              "filter":  {                  "term":  {                      "name":  "Linen  Blazer"                  }              }          }      }   } Matches 2 products Matches 1 product SELECT  *  FROM   products.product     WHERE     name  LIKE  "%Linen%"     OR     name  LIKE  "%Blazer%"

Slide 40

Slide 40 text

Filter vs Query

Slide 41

Slide 41 text

Filter •Does it match? Yes or no •When relevance doesn’t matter •Faster & cacheable •For non-analyzed data Query •How well does it match? •For full-text search •On analyzed/tokenized data

Slide 42

Slide 42 text

Match Query Multi Match Query Bool Query Boosting Query Common Terms Query Constant Score Query Dis Max Query Filtered Query Fuzzy Like This Query Fuzzy Like This Field Query Function Score Query Fuzzy Query GeoShape Query Has Child Query Has Parent Query Ids Query Indices Query Match All Query More Like This Query Nested Query Prefix Query Query String Query Simple Query String Query Range Query Regexp Query Span First Query Span Multi Term Query Span Near Query Span Not Query Span Or Query Span Term Query Term Query Terms Query Top Children Query Wildcard Query Minimum Should Match Multi Term Query Rewrite Template Query

Slide 43

Slide 43 text

And Filter Bool Filter Exists Filter Geo Bounding Box Filter Geo Distance Filter Geo Distance Range Filter Geo Polygon Filter GeoShape Filter Geohash Cell Filter Has Child Filter Has Parent Filter Ids Filter Indices Filter Limit Filter Match All Filter Missing Filter Nested Filter Not Filter Or Filter Prefix Filter Query Filter Range Filter Regexp Filter Script Filter Term Filter Terms Filter Type Filter

Slide 44

Slide 44 text

Filter examples

Slide 45

Slide 45 text

POST  /products/product/_search?pretty   {      "query":  {          "filtered":  {              "filter":  {                  "ids":  {                      "values":  [231,234,258]                  }              }          }      }   } SELECT  *  FROM   products.product     WHERE     entity_id  IN   (231,234,258)

Slide 46

Slide 46 text

POST  /products/product/_search?pretty   {      "query":  {          "filtered":  {              "filter":  {                  "bool":  {                      "must":  [                          {                              "range":  {                                  "price":  {                                      "gte":  100,                                      "lte":  400                                  }                              }                          }                      ],                      "must_not":  [                          {                              "term":  {                                  "name":  "Convertible  Dress"                              }                          }                      ],                      "should":  [                          {                              "term":  {                                  "category":  "Women"                              }                          },                          {                              "term":  {                                  "category":  "New  Arrivals"                              }                          }                      ]                  }              }          }      }   } SELECT  *  FROM   products.product     WHERE     price  BETWEEN  100  AND   400  AND   name  !=  "Convertible   Dress"  AND   (category  =  "Women"   OR  category  =  "New   Arrivals")

Slide 47

Slide 47 text

POST  /products/product/_search?pretty   {      "query":  {          "filtered":  {              "filter":  {                  "prefix":  {                      "name":  "Slim"                  }              }          }      }   } SELECT  *  FROM   products.product     WHERE     name  LIKE  "Slim%"

Slide 48

Slide 48 text

{          "filtered"  :  {                  "filter"  :  {                          "geo_distance_range"  :  {                                  "from"  :  "200km",                                  "to"  :  "400km",                                  "pin.location"  :  {                                          "lat"  :  40,                                          "lon"  :  -­‐70                                  }                          }                  }          }   } Requires “geo point” typed field

Slide 49

Slide 49 text

Relevance

Slide 50

Slide 50 text

{        "took":  1,        "timed_out":  false,        "_shards":  {              "total":  1,              "successful":  1,              "failed":  0        },        "hits":  {              "total":  2,              "max_score":  3.3350093,              "hits":  [                    {                          "_index":  "products",                          "_type":  "product",                          "_id":  "243",                          "_score":  3.3350093,                          "fields":  {                                "name":  [                                      "Linen  Blazer"                                ]                          }                    },                    {                          "_index":  "products",                          "_type":  "product",                          "_id":  "246",                          "_score":  0.5954286,                          "fields":  {                                "name":  [                                      "Stretch  Cotton  Blazer"                                ]                          }                    }              ]        }   } POST  /products/product/_search?pretty   {      "fields":  ["name"],        "query":  {          "match":  {              "name.raw":  "Linen  Blazer"          }      }   } Hits both terms. More relevant

Slide 51

Slide 51 text

{        "took":  1,        "timed_out":  false,        "_shards":  {              "total":  1,              "successful":  1,              "failed":  0        },        "hits":  {              "total":  1,              "max_score":  1,              "hits":  [                    {                          "_index":  "products",                          "_type":  "product",                          "_id":  "243",                          "_score":  1,                          "fields":  {                                "name":  [                                      "Linen  Blazer"                                ]                          }                    }              ]        }   } POST  /products/product/_search?pretty   {      "query":  {          "filtered":  {              "query":  {                  "match_all":  {}              },              "filter":  {                  "term":  {                      "name":  "Linen  Blazer"                  }              }          }      }   } No relevance on filters Score is always 1

Slide 52

Slide 52 text

POST  /products/product/_search?pretty   {      "fields":  ["name","description"],        "query":  {          "bool":  {              "must":  [                  {                      "match":  {                          "description.raw":  "suit"                      }                  }              ],              "should":  [                  {                      "match":  {                          "name.raw":  "coat"                      }                  }              ]          }      }   } Only search for “suit” Increase relevance if name contains “coat”

Slide 53

Slide 53 text

POST  /products/product/_search?pretty   {      "fields":  ["price","name","description","category"],        "query":  {          "bool":  {              "must":  [                  {                      "filtered":  {                          "filter":  {                              "bool":  {                                  "must":  [                                      {                                          "range":  {                                              "price":  {                                                  "gte":  100,                                                  "lte":  400                                              }                                          }                                      },                                      {                                          "term":  {                                              "category":  "Men"                                          }                                      }                                  ]                                  }                          }                      }                  }              ],              "should":  [                  {                      "match":  {                          "category":  "New  Arrivals"                      }                  }                              ]          }      }   } Increase relevance Combined filters

Slide 54

Slide 54 text

POST  /products/product/_search?pretty   {      "query":  {          "bool":  {              "must":  [                  {                      "match_all":  {}                  }              ],                "should":  [                  {                      "match":  {                          "description.raw":  {                              "query":  "comfort",                              "boost":  2                          }                      }                  },                  {                      "match":  {                          "name.raw":  {                              "query":  "tee",                              "boost":  3                          }                      }                  }                              ]          }      }   } Increase relevance Query- time boosting

Slide 55

Slide 55 text

Multi index multi type

Slide 56

Slide 56 text

SELECT  *     FROM  *.tbl_a*     WHERE     key  LIKE  ‘%val%’ •Cross-database queries •Wildcard database queries •Wildcard table queries Not supported in SQL

Slide 57

Slide 57 text

/_search   /products/_search   /products/product/_search   /products,clients/_search   /pro*/_search   /pro*,cli*/_search   /products/product,invoice/_search   /products/pro*/_search   /_all/product/_search   /_all/product,invoice/_search   /_all/pro*/_search  

Slide 58

Slide 58 text

Multi “all the things”

Slide 59

Slide 59 text

Aggregations

Slide 60

Slide 60 text

Group by on steroids

Slide 61

Slide 61 text

SELECT  COUNT(category)     FROM  products.product   GROUP  BY  category   Aggregations in SQL Metric Bucket

Slide 62

Slide 62 text

SELECT  COUNT(category)     FROM  products.product   GROUP  BY  category   POST  /products/product/_search? pretty&search_type=count    {      "aggs":  {          "number_of_categories"  :  {              "cardinality":  {                  "field":  "category"              }          }      }   } Metric Bucket Only aggs, no docs

Slide 63

Slide 63 text

POST  /products/product/_search?pretty    {      "fields":  ["category","price","name"],        "query":  {        "match":  {            "name.raw":  "blazer"        }      },      "aggs":  {          "avg_price":  {              "avg":  {                  "field":  "price"              }          },          "min_price"  :  {              "min":  {                  "field":  "price"              }          },          "max_price"  :  {              "max":  {                  "field":  "price"              }          },          "number_of_products_per_category"  :  {              "terms":  {                  "field":  "category",                  "size":  10              }          }      }   } Multi-group by besides query

Slide 64

Slide 64 text

     "aggregations":  {              "min_price":  {                    "value":  455              },              "number_of_products_per_category":  {                    "doc_count_error_upper_bound":  0,                    "sum_other_doc_count":  0,                    "buckets":  [                          {                                "key":  "Blazers",                                "doc_count":  2                          },                          {                                "key":  "Default  Category",                                "doc_count":  2                          },                          {                                "key":  "Men",                                "doc_count":  2                          }                    ]              },              "max_price":  {                    "value":  490              },              "avg_price":  {                    "value":  472.5              }        } Aggregation output Drill down search

Slide 65

Slide 65 text

Min Aggregation Max Aggregation Sum Aggregation Avg Aggregation Stats Aggregation Extended Stats Aggregation Value Count Aggregation Percentiles Aggregation Percentile Ranks Aggregation Cardinality Aggregation Geo Bounds Aggregation Top hits Aggregation Scripted Metric Aggregation Global Aggregation Filter Aggregation Filters Aggregation Missing Aggregation Nested Aggregation Reverse nested Aggregation Children Aggregation Terms Aggregation Significant Terms Aggregation Range Aggregation Date Range Aggregation IPv4 Range Aggregation Histogram Aggregation Date Histogram Aggregation Geo Distance Aggregation GeoHash grid Aggregation

Slide 66

Slide 66 text

Managing Elasticsearch

Slide 67

Slide 67 text

Plenty of ways … for which we don’t have enough time

Slide 68

Slide 68 text

Clustering

Slide 69

Slide 69 text

Single node 2 node cluster 3 node cluster

Slide 70

Slide 70 text

Example config settings node.rack:    my-­‐location   node.master:  true   node.data:  true   http.enabled:  true   cluster.name:  my-­‐cluster   node.name:  my-­‐node   index.number_of_shards:  5   index.number_of_replicas:  1   discovery.zen.minimum_master_nodes:  2

Slide 71

Slide 71 text

CAP theorem

Slide 72

Slide 72 text

CAP theorem Consistence Availability Partition tolerance

Slide 73

Slide 73 text

GET /_cat

Slide 74

Slide 74 text

GET  /_cat   =^.^=   /_cat/allocation   /_cat/shards   /_cat/shards/{index}   /_cat/master   /_cat/nodes   /_cat/indices   /_cat/indices/{index}   /_cat/segments   /_cat/segments/{index}   /_cat/count   /_cat/count/{index}   /_cat/recovery   /_cat/recovery/{index}   /_cat/health   /_cat/pending_tasks   /_cat/aliases   /_cat/aliases/{alias}   /_cat/thread_pool   /_cat/plugins   /_cat/fielddata   /_cat/fielddata/{fields}   Non-JSON output

Slide 75

Slide 75 text

GET  /_cat/shards?v   index        shard  prirep  state      docs  store  ip                          node       my-­‐index  2          r            STARTED        6  7.2kb  192.168.10.142  node3     my-­‐index  2          p            STARTED        6  9.5kb  192.168.10.142  node2     my-­‐index  0          p            STARTED        4  7.1kb  192.168.10.142  node3     my-­‐index  0          r            STARTED        4  4.8kb  192.168.10.142  node2     my-­‐index  3          r            STARTED        5  7.1kb  192.168.10.142  node1     my-­‐index  3          p            STARTED        5  7.2kb  192.168.10.142  node3     my-­‐index  1          p            STARTED        1  2.4kb  192.168.10.142  node1     my-­‐index  1          r            STARTED        1  2.4kb  192.168.10.142  node2     my-­‐index  4          p            STARTED        5  9.5kb  192.168.10.142  node1     my-­‐index  4          r            STARTED        5  9.4kb  192.168.10.142  node3   5 shards & a single replica by default

Slide 76

Slide 76 text

GET  /_cat/health? v&h=cluster,status,node.total,shards,pri,unassign,init   cluster      status  node.total  shards  pri  unassign  init     mycluster  green                      3          12      6                0        0     Cluster health

Slide 77

Slide 77 text

The ELK stack

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

Logs Parse & ship Store Visualize

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

Integrating Elasticsearch

Slide 82

Slide 82 text

It’s REST, deal with it! Directly from Javascript? Don’t forget to “restrict” access AJAX #FTW Behind a proxy No backend code

Slide 83

Slide 83 text

Or just use a backend API PHP Java Perl Python Ruby .NET

Slide 84

Slide 84 text

Since this is a PHP conference …

Slide 85

Slide 85 text

Composer #FTW {          "require":  {                  "elasticsearch/elasticsearch":  "~1.0"          }   } https://github.com/elastic/elasticsearch-php

Slide 86

Slide 86 text

search($searchParams); echo $results['hits']['hits'][0]["_source"]["rcpt"];

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

https://joind.in/talk/view/15442 I need feedback