Created
January 4, 2016 14:14
-
-
Save ludwigm/f0b51211f968ee305b4a to your computer and use it in GitHub Desktop.
ElasticSearch for Analytics presentation - Paste buffer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| bin/elasticsearch | |
| bin/plugin install mobz/elasticsearch-head // Broken in ES 2.0 | |
| bin/kibana -dev | |
| http://localhost:9200/ | |
| http://localhost:9200/_plugin/head/ | |
| http://localhost:5601/ | |
| http://localhost:5601/app/sense | |
| chrome-extension://lhjgkmllcaadmopgmanpapmpjgmfcfig/index.html | |
| OR Postman | |
| Data creation and intro | |
| DELETE /demo/ | |
| GET _cat/indices?v | |
| POST /demo/transactions | |
| { | |
| "product": "iPod", | |
| "price": 5, | |
| "date": "2015-01-01T00:00.000Z" | |
| } | |
| POST /demo/customer | |
| { | |
| "dateOfBirth": "1987-09-17", | |
| "gender": "male", | |
| "zipCode": "85586" | |
| } | |
| POST /demo/transaction_enriched | |
| { | |
| "product": "iPod", | |
| "price": 5, | |
| "date": "2015-01-01T00:00.000Z", | |
| "customer": { | |
| "dateOfBirth": "1987-09-17", | |
| "gender": "male", | |
| "zipCode": "85586" | |
| } | |
| } | |
| GET _cat/indices?v | |
| GET /demo/_mapping/ | |
| DELETE /demo/ | |
| PUT /demo/transactions/_bulk | |
| {"index": {}} | |
| {"product": "iPod", "price": 5, "date": "2015-01-01T00:00.000Z"} | |
| {"index": {}} | |
| {"product": "TV", "price": 1, "date": "2015-01-02T00:00.000Z"} | |
| {"index": {}} | |
| {"product": "Hifi", "price": 2, "date": "2015-01-03T00:00.000Z"} | |
| {"index": {}} | |
| {"product": "Car", "price": 5, "date": "2015-01-04T00:00.000Z"} | |
| {"index": {}} | |
| {"product": "iPod", "price": 50, "date": "2015-02-01T00:00.000Z"} | |
| {"index": {}} | |
| {"product": "TV", "price": 5, "date": "2015-02-02T00:00.000Z"} | |
| GET _stats/indices | |
| GET /demo/_search | |
| { | |
| "query": { | |
| "match_all": {} | |
| } | |
| } | |
| PUT /demo/customer/_bulk | |
| {"index": {}} | |
| {"dateOfBirth": "1987-09-17", "gender": "male", "zipCode" : "85586"} | |
| {"index": {}} | |
| {"dateOfBirth": "1995-01-01", "gender": "female", "zipCode" : "80804"} | |
| {"index": {}} | |
| {"dateOfBirth": "1937-01-01", "gender": "female", "zipCode" : "12345"} | |
| Do Kibana round-trip | |
| Show filter with auto-completion | |
| GET /demo/_search | |
| { | |
| "query": { | |
| "term": { | |
| "gender": { | |
| "value": "male" | |
| } | |
| } | |
| } | |
| } | |
| OR matching | |
| GET /demo/_search | |
| { | |
| "query": { | |
| "bool": { | |
| "should": [ | |
| { | |
| "term": { | |
| "gender": { | |
| "value": "male" | |
| } | |
| } | |
| }, | |
| { | |
| "term": { | |
| "zipCode": { | |
| "value": "12345" | |
| } | |
| } | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| Short alternative | |
| GET /demo/_search | |
| { | |
| "query": { | |
| "terms": { | |
| "zipCode": [ | |
| "12345", | |
| "85586" | |
| ] | |
| } | |
| } | |
| } | |
| Scripted fields: | |
| GET demo/customer/_search | |
| { | |
| "query": { | |
| "match_all": {} | |
| }, | |
| "script_fields": { | |
| "age": { | |
| "script": "DateTime.now().year - doc['dateOfBirth'].date.year" | |
| } | |
| } | |
| } | |
| Show aggregation format | |
| Range aggregation with scripted metrics | |
| ET demo/customer/_search | |
| { | |
| "size": 0, | |
| "query": { | |
| "match_all": {} | |
| }, | |
| "aggs": { | |
| "by_age_range": { | |
| "range": { | |
| "script": "DateTime.now().year - doc['dateOfBirth'].date.year", | |
| "ranges": [ | |
| { | |
| "from": 0, | |
| "to": 20 | |
| }, | |
| { | |
| "from": 20, | |
| "to": 40 | |
| }, | |
| { | |
| "from": 40, | |
| "to": 100 | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| } | |
| Index complex objects | |
| PUT /demo/transaction_enriched/_bulk | |
| {"index": {}} | |
| {"product": "iPod", "price": 5, "date": "2015-01-01T00:00.000Z", "customer" : {"dateOfBirth": "1987-09-17", "gender": "male", "zipCode" : "85586"}} | |
| {"index": {}} | |
| {"product": "TV", "price": 1, "date": "2015-01-02T00:00.000Z", "customer" : {"dateOfBirth": "1937-01-01", "gender": "female", "zipCode" : "12345"}} | |
| {"index": {}} | |
| {"product": "Hifi", "price": 2, "date": "2015-01-03T00:00.000Z", "customer" : {"dateOfBirth": "1987-09-17", "gender": "male", "zipCode" : "85586"}} | |
| {"index": {}} | |
| {"product": "Car", "price": 5, "date": "2015-01-04T00:00.000Z", "customer" : {"dateOfBirth": "1987-09-17", "gender": "male", "zipCode" : "85586"}} | |
| {"index": {}} | |
| {"product": "iPod", "price": 50, "date": "2015-02-01T00:00.000Z", "customer" : {"dateOfBirth": "1987-09-17", "gender": "male", "zipCode" : "85586"}} | |
| {"index": {}} | |
| {"product": "TV", "price": 5, "date": "2015-02-02T00:00.000Z", "customer" : {"dateOfBirth": "1937-01-01", "gender": "female", "zipCode" : "12345"}} | |
| GET demo/transaction_enriched/_search | |
| Aggregate on complex objects | |
| GET demo/transaction_enriched/_search | |
| { | |
| "size": 0, | |
| "query": { | |
| "match_all": {} | |
| }, | |
| "aggs": { | |
| "by_age_range": { | |
| "range": { | |
| "script": "DateTime.now().year - doc['customer.dateOfBirth'].date.year", | |
| "ranges": [ | |
| { | |
| "from": 0, | |
| "to": 20 | |
| }, | |
| { | |
| "from": 20, | |
| "to": 40 | |
| }, | |
| { | |
| "from": 20, | |
| "to": 100 | |
| } | |
| ] | |
| }, | |
| "aggs": { | |
| "sum_by_age_group": { | |
| "sum": { | |
| "field": "price" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Date histogram | |
| GET demo/transaction_enriched/_search | |
| { | |
| "size": 0, | |
| "query": { | |
| "match_all": {} | |
| }, | |
| "aggs": { | |
| "by_month": { | |
| "date_histogram": { | |
| "field": "date", | |
| "interval": "month" | |
| } | |
| } | |
| } | |
| } | |
| Date histogram + aggregated metrics | |
| GET demo/transaction_enriched/_search | |
| { | |
| "size": 0, | |
| "query": { | |
| "match_all": {} | |
| }, | |
| "aggs": { | |
| "by_month": { | |
| "date_histogram": { | |
| "field": "date", | |
| "interval": "month" | |
| }, | |
| "aggs": { | |
| "sum_by_month": { | |
| "sum": { | |
| "field": "price" | |
| } | |
| }, | |
| "avg_by_month": { | |
| "avg": { | |
| "field": "price" | |
| } | |
| }, | |
| "percentiles_by_month": { | |
| "percentiles": { | |
| "field": "price" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Add car data | |
| DELETE /cars | |
| PUT /cars/transactions/_bulk | |
| { "index": {}} | |
| { "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" } | |
| { "index": {}} | |
| { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" } | |
| { "index": {}} | |
| { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" } | |
| { "index": {}} | |
| { "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" } | |
| { "index": {}} | |
| { "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" } | |
| { "index": {}} | |
| { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" } | |
| { "index": {}} | |
| { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" } | |
| { "index": {}} | |
| { "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" } | |
| { "index": {}} | |
| { "price" : 20000, "color" : "black", "make" : "Audi", "sold" : "2014-09-28" } | |
| { "index": {}} | |
| { "price" : 20000, "color" : "red", "make" : "Audi", "sold" : "2014-12-05" } | |
| { "index": {}} | |
| { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-03-18" } | |
| { "index": {}} | |
| { "price" : 5000, "color" : "blue", "make" : "Tata", "sold" : "2014-07-02" } | |
| { "index": {}} | |
| { "price" : 7000, "color" : "green", "make" : "Tata", "sold" : "2014-09-19" } | |
| { "index": {}} | |
| { "price" : 20000, "color" : "red", "make" : "Audi", "sold" : "2014-05-05" } | |
| { "index": {}} | |
| { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" } | |
| { "index": {}} | |
| { "price" : 25000, "color" : "blue", "make" : "honda", "sold" : "2014-01-12" } | |
| { "index": {}} | |
| { "price" : 22000, "color" : "blue", "make" : "honda", "sold" : "2014-02-12" } | |
| { "index": {}} | |
| { "price" : 23000, "color" : "blue", "make" : "honda", "sold" : "2014-03-12" } | |
| { "index": {}} | |
| { "price" : 18000, "color" : "blue", "make" : "honda", "sold" : "2014-03-12" } | |
| { "index": {}} | |
| { "price" : 45000, "color" : "yellow", "make" : "Audi", "sold" : "2014-04-05" } | |
| Normal aggregations on cars | |
| GET /cars/transactions/_search?search_type=count | |
| { | |
| "aggs":{ | |
| "sales_per_month":{ | |
| "date_histogram":{ | |
| "field":"sold", | |
| "interval":"month", | |
| "format":"yyyy-MM-dd" | |
| }, | |
| "aggs":{ | |
| "monthly_sum":{ | |
| "sum":{ | |
| "field":"price" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Pipeline aggs: Average bucket | |
| GET /cars/transactions/_search?search_type=count | |
| { | |
| "aggs":{ | |
| "sales_per_month":{ | |
| "date_histogram":{ | |
| "field":"sold", | |
| "interval":"month", | |
| "format":"yyyy-MM-dd" | |
| }, | |
| "aggs":{ | |
| "monthly_sum":{ | |
| "sum":{ | |
| "field":"price" | |
| } | |
| } | |
| } | |
| }, | |
| "avg_monthly_sales":{ | |
| "avg_bucket":{ | |
| "buckets_path":"sales_per_month>monthly_sum" | |
| } | |
| } | |
| } | |
| } | |
| Pipeline aggs: Complex with multiple aggs | |
| GET /cars/transactions/_search?search_type=count | |
| { | |
| "aggs":{ | |
| "sales_per_month":{ | |
| "date_histogram":{ | |
| "field":"sold", | |
| "interval":"month", | |
| "format":"yyyy-MM-dd" | |
| }, | |
| "aggs":{ | |
| "monthly_sum":{ | |
| "sum":{ | |
| "field":"price" | |
| } | |
| } | |
| } | |
| }, | |
| "sales_per_quarter":{ | |
| "date_histogram":{ | |
| "field":"sold", | |
| "interval":"quarter", | |
| "format":"yyyy-MM" | |
| }, | |
| "aggs":{ | |
| "quarterly_sum":{ | |
| "sum":{ | |
| "field":"price" | |
| } | |
| } | |
| } | |
| }, | |
| "avg_monthly_sales":{ | |
| "avg_bucket":{ | |
| "buckets_path":"sales_per_month>monthly_sum" | |
| } | |
| }, | |
| "best_quarter_sale":{ | |
| "max_bucket":{ | |
| "buckets_path":"sales_per_quarter>quarterly_sum" | |
| } | |
| } | |
| } | |
| } | |
| Pipeline aggs: Cumulative sums | |
| GET /cars/transactions/_search?search_type=count | |
| { | |
| "aggs": { | |
| "sales_per_month": { | |
| "date_histogram": { | |
| "field": "sold", | |
| "interval": "month", | |
| "format": "yyyy-MM-dd" | |
| }, | |
| "aggs": { | |
| "monthly_sum": { | |
| "sum": { | |
| "field": "price" | |
| } | |
| }, | |
| "cumulative_sales": { | |
| "cumulative_sum": { | |
| "buckets_path": "monthly_sum" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Pipeline aggs: Filter aggregation + Scripted pipeline agg | |
| GET /cars/transactions/_search?search_type=count | |
| { | |
| "aggs": { | |
| "sales_per_month": { | |
| "date_histogram": { | |
| "field": "sold", | |
| "interval": "month", | |
| "format": "yyyy-MM-dd" | |
| }, | |
| "aggs": { | |
| "monthly_sum": { | |
| "sum": { | |
| "field": "price" | |
| } | |
| }, | |
| "bmw_car": { | |
| "filter": { | |
| "term": { | |
| "make": "bmw" | |
| } | |
| }, | |
| "aggs": { | |
| "sales": { | |
| "sum": { | |
| "field": "price" | |
| } | |
| } | |
| } | |
| }, | |
| "bmw_percentage": { | |
| "bucket_script": { | |
| "buckets_path": { | |
| "bmwSales": "bmw_car>sales", | |
| "totalSales": "monthly_sum" | |
| }, | |
| "script": "bmwSales / totalSales * 100" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Statistics: Extended stats | |
| GET /cars/transactions/_search?search_type=count | |
| { | |
| "aggs":{ | |
| "sales_per_month":{ | |
| "date_histogram":{ | |
| "field":"sold", | |
| "interval":"month", | |
| "format":"yyyy-MM-dd" | |
| }, | |
| "aggs":{ | |
| "stats":{ | |
| "extended_stats":{ | |
| "field":"price" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Pipeline aggs: Moving average (Timeline smoothing) | |
| GET /cars/transactions/_search?search_type=count | |
| { | |
| "aggs": { | |
| "sales_per_month": { | |
| "date_histogram": { | |
| "field": "sold", | |
| "interval": "month", | |
| "format": "yyyy-MM-dd" | |
| }, | |
| "aggs": { | |
| "stats": { | |
| "extended_stats": { | |
| "field": "price" | |
| } | |
| }, | |
| "movavg_mean": { | |
| "moving_avg": { | |
| "buckets_path": "stats.avg", | |
| "window": 3, | |
| "model": "ewma", | |
| "settings": { | |
| "alpha": 0.1 | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Edge Charts | |
| http://localhost:8080/index2.html | |
| $(document).ready(function() { | |
| var esQuery = { | |
| "aggs":{ | |
| "sales_per_month":{ | |
| "date_histogram":{ | |
| "field":"sold", | |
| "interval":"month", | |
| "format":"yyyy-MM-dd" | |
| }, | |
| "aggs":{ | |
| "monthly_sum":{ | |
| "sum":{ | |
| "field":"price" | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| d3.xhr("http://localhost:9200/cars/transactions/_search?search_type=count") | |
| .header("Content-Type", "application/json") | |
| .post( | |
| JSON.stringify(esQuery), | |
| function(err, rawData){ | |
| var data = JSON.parse(rawData.response); | |
| console.log("got response", data); | |
| drawChart(data); | |
| } | |
| ); | |
| }) | |
| function drawChart(data) { | |
| var buckets = data.aggregations.sales_per_month.buckets; | |
| console.log("buckets: ", buckets); | |
| var graphData = []; | |
| _.forEach(buckets, function(bucket){ | |
| graphData.push({ | |
| x: bucket.key_as_string, | |
| y: bucket.doc_count | |
| }); | |
| }) | |
| var chart = d4.charts.column().outerWidth(800); | |
| d3.select('#graph') | |
| .datum(graphData) | |
| .call(chart); | |
| } | |
| Edge Charts Kibana plugin | |
| gulp dev | |
| http://localhost:5601/app/edge-charts-plugin | |
| Timelion | |
| http://localhost:5601/app/timelion#/New-TimeLion-Sheet?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-5y,interval:'1M',mode:quick,to:now))&_a=(columns:3,interval:'1M',otherInterval:'1w',rows:3,selected:0,sheet:!('.es(*,%20metric%3D!'max:price!').bars(4).points(radius%3D3,%20weight%3D1)','(.es(*),%20.es(make:bmw)).lines(fill%3D3)','.es(make:bmw).divide(.es(*)).multiply(100).bars()','.es(*).derivative()')) | |
| Maximum per month | |
| .es(*, metric='max:price').bars(4).points(radius=3, weight=1) | |
| Multiple charts | |
| (.es(*), .es(make:bmw)).lines(fill=3) | |
| Division with timelines | |
| .es(make:bmw).divide(.es(*)).multiply(100).bars() | |
| Derivative | |
| .es(*).derivative() | |
| Edge JVM | |
| Scala | |
| val client = ElasticClient.transport(ElasticsearchClientUri("elasticsearch://localhost:9300")) | |
| val resp = client.execute{ | |
| search in "demo" / "transaction_enriched" aggregations( | |
| aggregation datehistogram ("by_month") field("date") interval(DateHistogramInterval.MONTH) | |
| aggregations( | |
| aggregation avg("avg_by_month") field("price") | |
| ) | |
| ) | |
| }.await | |
| val hist:Histogram = resp.aggregations.get("by_month") | |
| hist.getBuckets.map(bucket => { | |
| val avg:Avg = bucket.getAggregations.get("avg_by_month") | |
| println(s"${bucket.getKeyAsString}: ${avg.getValue}") | |
| }) | |
| Java | |
| Client client = TransportClient.builder().build() | |
| .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); | |
| SearchResponse response = client.prepareSearch("demo") | |
| .setTypes("transaction_enriched") | |
| .addAggregation( | |
| AggregationBuilders.dateHistogram("by_month") | |
| .interval(DateHistogramInterval.MONTH) | |
| .field("date") | |
| .subAggregation( | |
| AggregationBuilders.avg("avg_by_month") | |
| .field("price") | |
| ) | |
| ) | |
| .execute() | |
| .actionGet(); | |
| Histogram agg = response.getAggregations().get("by_month"); | |
| agg.getBuckets().stream().forEach( bucket -> { | |
| Avg subAgg = bucket.getAggregations().get("avg_by_month"); | |
| System.out.println("bucket = " + bucket.getKeyAsString() + ": " + subAgg.getValue()); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment