├── .gitattributes
├── .gitignore
├── README.md
├── beats
├── .gitattributes
├── .gitignore
├── README.md
├── datadumpbeat-darwin-amd64
├── datadumpbeat-linux-amd64
└── datadumpbeat.yml
├── docker-compose-elasticsearch.yml
├── docker-compose.yml
├── download-sample-files.sh
├── elasticsearch
├── Dockerfile
└── config
│ ├── analysis
│ └── first_name.synonyms.txt
│ ├── elasticsearch.yml
│ └── logging.yml
├── exercises
├── README.md
├── aggregations.sense
├── bootstrap.min.css
├── elastic-favicon.ico
├── getting-started.sense
├── index.css
├── index.html
├── indexing.sense
├── mapping-and-analysis.sense
├── more-like-this.sense
├── nginx
│ └── nginx.conf
├── paging-and-sorting.sense
├── percolators.sense
├── searching.sense
└── suggestions.sense
├── images
├── download-docker-for-mac.png
├── elasticsearch-screenshot.png
├── inquisitor-screenshot.png
├── kibana-screenshot.png
├── kopf-screenshot.png
├── marvel-screenshot.png
├── sense-screenshot.png
├── set-dfm-memory.png
└── slides-screenshot.png
├── init-all-the-things.sh
├── kibana
├── Dockerfile
└── config
│ └── kibana.yml
├── load-sample-snapshots.sh
├── logstash
├── logstash-es-template.json
└── logstash.conf
├── presentation
└── sections
│ └── query.md
├── slides
├── .bowerrc
├── .editorconfig
├── .gitignore
├── .jshintrc
├── .yo-rc.json
├── Dockerfile
├── Gruntfile.coffee
├── bower.json
├── css
│ ├── bootstrap.min.css
│ ├── ix-illustration.css
│ ├── kopf-custom.css
│ └── source
│ │ ├── flat-ui-colors.min.css
│ │ ├── flat-ui-colors.scss
│ │ └── theme.scss
├── images
│ ├── JavaApiInstall.png
│ ├── ab-results.png
│ ├── airbnb.png
│ ├── allie.png
│ ├── amazon-java.png
│ ├── analysis-chain.svg
│ ├── andrea.png
│ ├── angular.png
│ ├── animations
│ │ ├── lucene-merge-concurrent.gif
│ │ └── lucene-merge-tiered.gif
│ ├── aphyr.png
│ ├── arena.png
│ ├── asgard.png
│ ├── automatic-mapping.png
│ ├── aws.svg
│ ├── backbone.png
│ ├── backbone.svg
│ ├── blue.svg
│ ├── bob.png
│ ├── book-index.png
│ ├── carrot2.gif
│ ├── carrot2.png
│ ├── cedric.png
│ ├── channelcompany.gif
│ ├── chicago-cubs.png
│ ├── chicago-sun-times.png
│ ├── chicagocom.png
│ ├── coffeescript.svg
│ ├── conference-solutions.png
│ ├── cote-tweet.png
│ ├── crn.png
│ ├── cubs.png
│ ├── datascope.png
│ ├── dena.png
│ ├── diagrams
│ │ ├── analysis-chain-with-background.png
│ │ ├── analysis-chain.graffle
│ │ ├── analysis-chain.png
│ │ ├── analysis-chain.svg
│ │ ├── beats-logstash-es-flow.png
│ │ ├── bm25-calculation.png
│ │ ├── bm25-formula.png
│ │ ├── cluster-topology.png
│ │ ├── deep-pagination-problem.png
│ │ ├── highschoolcube.png
│ │ ├── merge-flow.png
│ │ ├── numeric-trie.png
│ │ ├── panera.png
│ │ ├── query-request-data-flow.jpeg
│ │ ├── relational-vs-document-model.png
│ │ ├── relational-vs-nonrelational.jpg
│ │ ├── search-query-lifecycle.graffle
│ │ ├── segment-file.png
│ │ ├── segment-hierarchy.jpeg
│ │ ├── split-brain.jpeg
│ │ └── write-request-data-flows.jpeg
│ ├── divvy-data-dashboard.png
│ ├── do-it-yourself.svg
│ ├── document-structure.svg
│ ├── doejo.png
│ ├── dojo.svg
│ ├── elastic-favicon.ico
│ ├── elastic-white.png
│ ├── elastic.png
│ ├── elasticsearch.png
│ ├── elk-flow.png
│ ├── es-big-data-github.png
│ ├── es-configurable.png
│ ├── es-github.png
│ ├── es-karmi.png
│ ├── es-shakespeare-json.png
│ ├── fluentd.png
│ ├── flume.png
│ ├── gary.png
│ ├── gatling.png
│ ├── github.svg
│ ├── gohealth.png
│ ├── grails.svg
│ ├── green.png
│ ├── groovy.svg
│ ├── healthgrades.png
│ ├── highschoolcube.png
│ ├── hostedbuyer.png
│ ├── humio.svg
│ ├── index-structure.svg
│ ├── intermission.jpg
│ ├── java.svg
│ ├── jenkins.png
│ ├── jerry.png
│ ├── jmeter.png
│ ├── jon.png
│ ├── jquery.svg
│ ├── kevin.png
│ ├── kibana-4-waxy-dashboard.png
│ ├── kibana.png
│ ├── kimchy.jpeg
│ ├── less-css.png
│ ├── logo_bw.png
│ ├── logos
│ │ └── beats.png
│ ├── logstash-search-screenshot.png
│ ├── logstash.png
│ ├── lucene.png
│ ├── mahout.svg
│ ├── malynda.png
│ ├── mapping-analysis.svg
│ ├── marionettejs.png
│ ├── mileiq.png
│ ├── mobiquity.png
│ ├── mongodb.png
│ ├── mozilla.svg
│ ├── nemik.png
│ ├── neo4j.svg
│ ├── nmh.gif
│ ├── northwestern-medicine.png
│ ├── nutch.png
│ ├── packer.png
│ ├── panera-bread.png
│ ├── panera.png
│ ├── pds-life-sciences.gif
│ ├── percolator.gif
│ ├── phosphor.jpg
│ ├── postgres.svg
│ ├── puppet.svg
│ ├── query-steps.svg
│ ├── querying_vs_filtering.svg
│ ├── raise.png
│ ├── red-and-green-ornaments.jpg
│ ├── red-green-m-m.jpg
│ ├── red.png
│ ├── red_green.jpg
│ ├── reverb.png
│ ├── roberto.png
│ ├── rocketmiles.png
│ ├── rsyslog.png
│ ├── safe.svg
│ ├── scala.png
│ ├── screenshots
│ │ ├── ab-results.png
│ │ ├── aphyr-strangeloop-talk.jpg
│ │ ├── elastic-security.png
│ │ ├── elasticsearch-github.png
│ │ ├── kibana-screenshot.png
│ │ ├── kopf-node-failure.png
│ │ ├── kopf-screenshot.png
│ │ └── searchkit.png
│ ├── sharding-replica.svg
│ ├── shay-bannon.jpg
│ ├── simian-army.png
│ ├── simplicity.png
│ ├── spantree-silver.png
│ ├── spantree-white.png
│ ├── spantree.svg
│ ├── spark.png
│ ├── split-brain.svg
│ ├── tcc.jpg
│ ├── team.jpg
│ ├── vagrant.png
│ ├── vault.svg
│ ├── wrapports.png
│ └── yello.png
├── js
│ ├── ix-illustration.js
│ ├── loadhtmlslides.js
│ ├── markdown-customizations.js
│ └── templates
│ │ ├── _invindex.html
│ │ └── _scoring.html
├── package.json
├── resources
│ └── .gitkeep
├── slides
│ ├── advanced-querying.md
│ ├── aggregations.md
│ ├── clustering.md
│ ├── es-intro.md
│ ├── es-is-not.md
│ ├── es-is.md
│ ├── indexing.md
│ ├── intro.md
│ ├── list.json
│ ├── logging.md
│ ├── mapping-and-analysis.md
│ ├── percolator.md
│ ├── querying.md
│ ├── security.md
│ ├── suggestions.md
│ ├── terminology.md
│ └── tools.md
└── templates
│ ├── _index.html
│ └── _section.html
├── snapshot-manifest
└── www
├── Dockerfile
├── nginx
└── default.conf
├── slides
├── css
│ ├── print
│ │ ├── paper.css
│ │ └── pdf.css
│ ├── reveal.css
│ ├── reveal.min.css
│ └── theme
│ │ ├── README.md
│ │ ├── beige.css
│ │ ├── blood.css
│ │ ├── default.css
│ │ ├── moon.css
│ │ ├── night.css
│ │ ├── serif.css
│ │ ├── simple.css
│ │ ├── sky.css
│ │ ├── solarized.css
│ │ ├── source
│ │ ├── beige.scss
│ │ ├── blood.scss
│ │ ├── default.scss
│ │ ├── moon.scss
│ │ ├── night.scss
│ │ ├── serif.scss
│ │ ├── simple.scss
│ │ ├── sky.scss
│ │ └── solarized.scss
│ │ └── template
│ │ ├── mixins.scss
│ │ ├── settings.scss
│ │ └── theme.scss
├── custom_css
│ ├── bootstrap.min.css
│ ├── spantree.css
│ └── sublime_monokai.css
├── index.html
├── js
│ ├── angular.js
│ ├── reveal.js
│ └── reveal.min.js
├── lib
│ ├── css
│ │ ├── tomorrow-night-bright.css
│ │ └── zenburn.css
│ ├── font
│ │ ├── league_gothic-webfont.eot
│ │ ├── league_gothic-webfont.svg
│ │ ├── league_gothic-webfont.ttf
│ │ ├── league_gothic-webfont.woff
│ │ └── league_gothic_license
│ └── js
│ │ ├── classList.js
│ │ ├── head.min.js
│ │ └── html5shiv.js
├── omnigraffle
│ └── indexing.graffle
├── outline.mmap
├── outline.png
└── plugin
│ ├── highlight
│ └── highlight.js
│ ├── leap
│ └── leap.js
│ ├── markdown
│ ├── example.html
│ ├── example.md
│ ├── markdown.js
│ └── marked.js
│ ├── math
│ └── math.js
│ ├── multiplex
│ ├── client.js
│ ├── index.js
│ └── master.js
│ ├── notes-server
│ ├── client.js
│ ├── index.js
│ └── notes.html
│ ├── notes
│ ├── notes.html
│ └── notes.js
│ ├── postmessage
│ ├── example.html
│ └── postmessage.js
│ ├── print-pdf
│ └── print-pdf.js
│ ├── remotes
│ └── remotes.js
│ ├── search
│ └── search.js
│ └── zoom-js
│ └── zoom.js
├── transform
├── build.gradle
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
│ └── main
│ ├── groovy
│ └── net
│ │ └── spantree
│ │ └── elasticsearch
│ │ └── talk
│ │ ├── ExampleParts.groovy
│ │ └── TransformExamples.groovy
│ └── resources
│ └── logback.xml
└── visualizations
├── README.md
├── bower.json
├── dcjs.html
├── images
└── Divvy_Logo.svg
├── index.html
├── morley.csv
└── scripts
├── d3.v3.js
├── demo.coffee
├── demo.js
├── elasticsearch.js
├── main.js
└── require.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Set the default end of line behavior
2 | * text eol=lf
3 | *.tar.gz binary
4 | *.tar.bz2 binary
5 | *.2.bz2 binary
6 | *.gz binary
7 | *.png binary
8 | *.jpg binary
9 | *.gif binary
10 | *.jar binary
11 | *.woff binary
12 | *.eot binary
13 | *.otf binary
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vagrant
2 | .DS_Store
3 | .vagrant*
4 | .name
5 | .idea
6 | *.iml
7 | data
8 | transform/build
9 | transform/.gradle
10 | estalk-precise-vbox-x86_64.box
11 | transform/www
12 | presentation/outline (Autosaved).mmap
13 | presentation/~$outline.mmap.~$lock
14 | visualizations/bower_components
15 | transform/lib
16 | www/transform/build
17 | www/transform/lib
18 | www/transform/.gradle
19 | logstash/.gradle
20 | logstash/build
21 | theme.css
22 |
--------------------------------------------------------------------------------
/beats/.gitattributes:
--------------------------------------------------------------------------------
1 | datadumpbeat-*-* binary
2 |
--------------------------------------------------------------------------------
/beats/.gitignore:
--------------------------------------------------------------------------------
1 | data/
2 | logs/
3 |
--------------------------------------------------------------------------------
/beats/README.md:
--------------------------------------------------------------------------------
1 | # Overview
2 | This is a compiled version of a simple beat we created to simulate completely fake, pseudo-random Apache traffic from a Beat.
3 |
4 | The short term goals are to simply show how Logstash, Beats, etc. can play nicely together in a testing and lab environment.
5 |
6 | # Usage
7 | To execute the data dump, it's easiest to simply execute from the command line.
8 |
9 | `./datadumpbeat-darwin-amd64 -e` - Starts the beat and outputs the logs to the STDERR/STDOUT
--------------------------------------------------------------------------------
/beats/datadumpbeat-darwin-amd64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/beats/datadumpbeat-darwin-amd64
--------------------------------------------------------------------------------
/beats/datadumpbeat-linux-amd64:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/beats/datadumpbeat-linux-amd64
--------------------------------------------------------------------------------
/beats/datadumpbeat.yml:
--------------------------------------------------------------------------------
1 | ################### datadumpbeat Configuration Example #########################
2 |
3 | ############################# datadumpbeat ######################################
4 |
5 | datadumpbeat:
6 | # Defines how often an event is sent to the output
7 | period: 1s
8 | # Number of events to simulate in that period
9 | events_per_period: 10
10 | # Locale of the traffic to simulate
11 | locale: en
12 |
13 | #----------------------------- Logstash output --------------------------------
14 | output.logstash:
15 | # The Logstash hosts
16 | hosts: ["localhost:5044"]
17 |
18 | # Optional SSL. By default is off.
19 | # List of root certificates for HTTPS server verifications
20 | #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
21 |
22 | # Certificate for SSL client authentication
23 | #ssl.certificate: "/etc/pki/client/cert.pem"
24 |
25 | # Client Certificate Key
26 | #ssl.key: "/etc/pki/client/cert.key"
27 |
28 | #================================ Logging =====================================
29 |
30 | # Sets log level. The default log level is info.
31 | # Available log levels are: critical, error, warning, info, debug
32 | logging.level: debug
33 |
34 | # At debug level, you can selectively enable logging only for some components.
35 | # To enable all selectors use ["*"]. Examples of other selectors are "beat",
36 | # "publish", "service".
37 | logging.selectors: ["*"]
38 |
39 | #================================ General =====================================
40 |
41 | # The name of the shipper that publishes the network data. It can be used to group
42 | # all the transactions sent by a single shipper in the web interface.
43 | #name:
44 |
45 | # The tags of the shipper are included in their own field with each
46 | # transaction published.
47 | #tags: ["service-X", "web-tier"]
48 |
49 | # Optional fields that you can specify to add additional information to the
50 | # output.
51 | #fields:
52 | # env: staging
53 |
54 | #================================ Outputs =====================================
55 |
56 | # Configure what outputs to use when sending the data collected by the beat.
57 | # Multiple outputs may be used.
58 |
59 | #-------------------------- Elasticsearch output ------------------------------
60 | #output.elasticsearch:
61 | # Array of hosts to connect to.
62 | #hosts: ["localhost:9200"]
63 |
64 | # Optional protocol and basic auth credentials.
65 | #protocol: "https"
66 | #username: "elastic"
67 | #password: "changeme"
68 |
69 |
--------------------------------------------------------------------------------
/docker-compose-elasticsearch.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | elasticsearch:
4 | build: elasticsearch
5 | volumes:
6 | - "./elasticsearch/config:/usr/share/elasticsearch/config"
7 | environment:
8 | ES_NODENAME: $HOSTNAME
9 | ulimits:
10 | memlock:
11 | soft: -1
12 | hard: -1
13 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | elastic1:
4 | extends:
5 | file: docker-compose-elasticsearch.yml
6 | service: elasticsearch
7 | environment:
8 | ES_NODENAME: elastic1
9 | ports:
10 | - "9200:9200"
11 | - "9300:9300"
12 | elastic2:
13 | extends:
14 | file: docker-compose-elasticsearch.yml
15 | service: elasticsearch
16 | environment:
17 | ES_NODENAME: elastic2
18 | ports:
19 | - "9201:9200"
20 | - "9301:9300"
21 | depends_on:
22 | - elastic1
23 | elastic3:
24 | extends:
25 | file: docker-compose-elasticsearch.yml
26 | service: elasticsearch
27 | environment:
28 | ES_NODENAME: elastic3
29 | ports:
30 | - "9202:9200"
31 | - "9302:9300"
32 | depends_on:
33 | - elastic1
34 | inquisitor:
35 | image: spantree/elasticsearch-inquisitor
36 | environment:
37 | ELASTICSEARCH_URL: "http://elastic1:9200"
38 | ports:
39 | - "9400:80"
40 | exercises:
41 | image: nginx:1.11-alpine
42 | volumes:
43 | - "./exercises:/usr/share/nginx/html"
44 | - "./exercises/nginx:/etc/nginx"
45 | ports:
46 | - "9500:80"
47 | logstash:
48 | image: logstash:2.4
49 | volumes:
50 | - "./logstash:/config-dir"
51 | - "./data:/usr/local/share/data"
52 | command: ["logstash", "-f", "/config-dir/logstash.conf"]
53 | ports:
54 | - "3333:3333"
55 | - "5044:5044"
56 | - "9600:9600"
57 | depends_on:
58 | - elastic1
59 | - elastic2
60 | - elastic3
61 | kibana:
62 | build: kibana
63 | ports:
64 | - "5601:5601"
65 | environment:
66 | ELASTICSEARCH_URL: "http://elastic1:9200"
67 | volumes:
68 | - "./kibana/config:/opt/kibana/config"
69 | depends_on:
70 | - elastic1
71 | - elastic2
72 | - elastic3
73 | slides:
74 | build: slides
75 | ports:
76 | - "9000:9000"
77 | - "35729:35729" # to enable live reloading
78 | environment:
79 | ELASTICSEARCH_URL: http://localhost:9200
80 | KIBANA_URL: http://localhost:5601
81 | INQUISITOR_URL: http://localhost:9400
82 | EXERCISES_URL: http://localhost:9500
83 | volumes:
84 | - ./slides/slides:/usr/src/slides/slides
85 |
--------------------------------------------------------------------------------
/download-sample-files.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -o xtrace # trace what gets executed
4 | set -o errexit # exit when a command fails.
5 | set -o nounset # exit when your script tries to use undeclared variables
6 |
7 | __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8 |
9 | GZ_URLS="\
10 | https://s3.amazonaws.com/elasticsearch-sample-data/enron_messages.jsonl.gz \
11 | http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz \
12 | "
13 |
14 | NORMAL_URLS="\
15 | https://github.com/elastic/examples/raw/master/Common%20Data%20Formats/apache_logs/apache_logs \
16 | https://data.cityofnewyork.us/api/views/h9gi-nx95/rows.csv?accessType=DOWNLOAD
17 | https://raw.githubusercontent.com/elastic/examples/master/Exploring%20Public%20Datasets/nyc_traffic_accidents/nyc_collision_logstash.conf \
18 | https://raw.githubusercontent.com/elastic/examples/master/Exploring%20Public%20Datasets/nyc_traffic_accidents/nyc_collision_template.json \
19 | https://raw.githubusercontent.com/elastic/examples/master/Exploring%20Public%20Datasets/nyc_traffic_accidents/nyc_collision_kibana.json \
20 | "
21 |
22 | mkdir -p data
23 | cd data
24 |
25 | for url in $GZ_URLS; do
26 | filename=$(basename $url)
27 | filename="${filename/.gz/}"
28 | if [ ! -f $filename ]; then
29 | curl -L $url | gunzip > $filename
30 | fi
31 | done
32 |
33 | for url in $NORMAL_URLS; do
34 | filename=$(basename $url)
35 | if [ ! -f $filename ]; then
36 | wget $url
37 | fi
38 | done
39 |
40 | cd $__dir
41 |
--------------------------------------------------------------------------------
/elasticsearch/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM elasticsearch:2.4.5
2 |
3 | MAINTAINER Spantree Technology Group
4 |
5 | # Install Marvel (and Sense)
6 | RUN plugin install license \
7 | && plugin install -b marvel-agent \
8 | && plugin install lmenezes/elasticsearch-kopf \
9 | && plugin install polyfractal/elasticsearch-inquisitor \
10 | && plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.4.5.0/elasticsearch-sql-2.4.5.0.zip
11 |
12 | # Add configuration folders and files onto system
13 | COPY config /usr/share/elasticsearch/config
14 |
--------------------------------------------------------------------------------
/elasticsearch/config/elasticsearch.yml:
--------------------------------------------------------------------------------
1 | network:
2 | host: _site_
3 | node:
4 | name: ${ES_NODENAME}
5 | index:
6 | number_of_replicas: 0
7 | http:
8 | max_content_length: 500mb
9 | cluster:
10 | routing:
11 | allocation:
12 | cluster_concurrent_rebalance: 2
13 | balance:
14 | primary: 1
15 | bootstrap:
16 | mlockall: true
17 | indices:
18 | fielddata:
19 | cache:
20 | size: 25%
21 | discovery:
22 | zen:
23 | ping:
24 | unicast:
25 | hosts:
26 | - elastic1
27 | multicast:
28 | enabled: false
29 | minimum_master_nodes: 2
30 | repositories:
31 | url:
32 | allowed_urls: ["https://elasticsearch-sample-data.s3.amazonaws.com/*"]
33 | script:
34 | engine:
35 | groovy:
36 | inline:
37 | aggs: true
38 | mapping: true
39 | search: true
40 | update: true
41 | plugin: true
42 | indexed:
43 | aggs: true
44 | mapping: true
45 | search: true
46 | update: true
47 | plugin: true
48 |
--------------------------------------------------------------------------------
/elasticsearch/config/logging.yml:
--------------------------------------------------------------------------------
1 | # you can override this using by setting a system property, for example -Des.logger.level=DEBUG
2 | es.logger.level: INFO
3 | rootLogger: ${es.logger.level}, console
4 | logger:
5 | # log action execution errors for easier debugging
6 | action: DEBUG
7 | # reduce the logging for aws, too much is logged under the default INFO
8 | com.amazonaws: WARN
9 |
10 | appender:
11 | console:
12 | type: console
13 | layout:
14 | type: consolePattern
15 | conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"
--------------------------------------------------------------------------------
/exercises/README.md:
--------------------------------------------------------------------------------
1 | ### Elasticsearch Exercises
2 |
3 | 1. [Getting Started](getting-started.sense)
4 | 2. [Indexing](indexing.sense)
5 | 3. [Searching](searching.sense)
6 | 4. [Mapping and Analysis](mapping-and-analysis.sense)
7 | 5. [Paging and Sorting](paging-and-sorting.sense)
8 | 6. [Aggregations](aggregations.sense)
9 | 7. [Percolators](percolators.sense)
10 | 8. [More Like This](more-like-this.sense)
11 | 9. [Suggestions](suggestions.sense)
12 |
--------------------------------------------------------------------------------
/exercises/elastic-favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/exercises/elastic-favicon.ico
--------------------------------------------------------------------------------
/exercises/getting-started.sense:
--------------------------------------------------------------------------------
1 | # Getting Started
2 | # ===============
3 |
4 | # Get server status. Executing an HTTP GET request to the root of
5 | # the Elasticsearch web server will give you a server status as JSON.
6 | #
7 | GET /
8 |
9 | # Index a single document. Now, we will insert a single document
10 | # into Elasticsearch. Note that we don't need to create an index or
11 | # type, it gets created automatically if it doesn't already exist.
12 | # Elasticsearch will also try to guess the types for document fields
13 | # based on the initial JSON payload.
14 | #
15 | PUT /getting-started/locations/frontera_grill
16 | {
17 | "name": "Frontera Grill",
18 | "url": "http://en.wikipedia.org/wiki/Frontera_Grill",
19 | "keywords": [
20 | "restaurants",
21 | "chicago,illinois"
22 | ],
23 | "wikipedia_numeric_id": 7353370,
24 | "lastUpdated": "2012-07-12T10:37:44+0000"
25 | }
26 |
27 | # Fetch our document. You can retrieve a single document by its ID
28 | # with a simple HTTP GET request.
29 | #
30 | GET /getting-started/locations/frontera_grill
31 |
32 | # Finding all documents. We can also execute a request to get all
33 | # documents in this index. At this point, there should only be one.
34 | #
35 | GET /getting-started/_search
36 |
37 | # Review the mappings. We can also peek at the mappings Elasticsearch
38 | # automatically generated for the location document type.
39 | #
40 | GET /getting-started/locations/_mapping
41 |
--------------------------------------------------------------------------------
/exercises/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #2C3E50;
3 | color: #ECF0F1;
4 | font-family: -apple-system, BlinkMacSystemFont, 'Open Sans', Helvetica, sans-serif;
5 | font-size: 2.0em;
6 | font-weight: 100;
7 | letter-spacing: 0.05em;
8 | }
9 |
10 | h1, h2 {
11 | font-weight: 300;
12 | }
13 |
14 | h1, h2, h3, h4, h5 {
15 | padding-bottom: 1em;
16 | padding-top: 1em;
17 | }
18 |
19 | a, a:hover, a:visited {
20 | text-decoration: none;
21 | }
22 |
23 | a {
24 | color: #ECF0F1;
25 | }
26 |
27 | a:hover {
28 | color: #BDC3C7;
29 | }
30 |
31 | ol, ul {
32 | margin: 0;
33 | padding: 0;
34 | }
35 |
36 | ol li, ul li {
37 | padding: 0;
38 | margin: 0;
39 | }
40 |
41 | ol li {
42 | list-style-position: inside;
43 | }
44 |
45 | ul {
46 | list-style: none;
47 | }
48 |
49 | .useful-links a {
50 | color: #ECF0F1;
51 | background-color: #8E44AD;
52 | padding: 0.2em 0.4em;
53 | font-weight: 100;
54 | font-size: 0.9em;
55 | margin: 0 0.1em;
56 | }
57 |
58 | .useful-links a:hover {
59 | background-color: #9B59B6;
60 | }
61 |
62 | .useful-links a:after {
63 | font-family: FontAwesome;
64 | // fa-external-link
65 | content: "\f08e";
66 | padding-left: 0.5em;
67 | font-size: 0.7em;
68 | }
69 |
70 | .container {
71 | padding: 2em;
72 | text-align: center;
73 | }
74 |
--------------------------------------------------------------------------------
/exercises/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Tutorial
4 |
5 |
6 |
7 |
8 |
9 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/exercises/indexing.sense:
--------------------------------------------------------------------------------
1 | # Indexing
2 | # ========
3 |
4 | # Index John Doe with an assigned ID.
5 | #
6 | POST /spantree/people/
7 | {
8 | "name": "Johnny Noname"
9 | }
10 |
11 | # Find John in the index.
12 | #
13 | GET /spantree/_search
14 |
15 | # Review automatic mappings. Elasticsearch will automatically guess
16 | # mappings for new fields.
17 | GET /spantree/_mapping
18 |
19 | # Index Cedric with a known ID.
20 | #
21 | PUT /spantree/people/cedric
22 | {
23 | "name": "Cedric Hurst",
24 | "title": "Principal"
25 | }
26 |
27 | # Make Sure Cedric is there.
28 | #
29 | GET /spantree/people/cedric
30 |
31 | # Add more information about Cedric.
32 | #
33 | POST /spantree/people/cedric/_update
34 | {
35 | "doc": {
36 | "git_commits": 2560
37 | }
38 | }
39 |
40 | # Add one more git commit for Cedric.
41 | #
42 | POST /spantree/people/cedric/_update
43 | {
44 | "script": "ctx._source.git_commits += 1",
45 | "lang": "groovy"
46 | }
47 |
48 | # Upsert Kevin.
49 | #
50 | POST /spantree/people/kevin/_update
51 | {
52 | "doc": {
53 | "git_commits": 1912
54 | },
55 | "upsert": {
56 | "name": "Kevin Greene",
57 | "title": "Senior Software Engineer",
58 | "git_commits": 1912
59 | }
60 | }
61 |
62 | # Make sure Kevin is still there.
63 | #
64 | GET /spantree/people/kevin
65 |
66 | # Add everyone else.
67 | #
68 | POST /spantree/_bulk
69 | {"index":{"_id":"gary","_type": "people"}}
70 | {"name":"Gary Turovsky","title":"Senior Software Engineer","git_commits": 611}
71 | {"index":{"_id":"jonathan","_type": "people"}}
72 | {"name":"Jonathan Freeman","title":"Software Engineer","git_commits": 186}
73 |
74 | # Review the whole list.
75 | #
76 | GET /spantree/_search
77 |
--------------------------------------------------------------------------------
/exercises/more-like-this.sense:
--------------------------------------------------------------------------------
1 | # More like this
2 | # ==============
3 |
4 | # Register a "more like this" query. More like this (or MLT) queries
5 | # allow you to find documents that are "like" a document you specify,
6 | # containing a similar string or description.
7 | #
8 | # This request will return all documents with similar names,"about"
9 | # fields, or descriptions as the lake_shore_drive wikipedia page.
10 | #
11 | POST /wikipedia/_search
12 | {
13 | "query": {
14 | "more_like_this" : {
15 | "fields" : ["name", "about", "description"],
16 | "like" : [
17 | {
18 | "_index" : "wikipedia",
19 | "_type" : "locations",
20 | "_id" : "northwestern_university_settlement_house"
21 | }
22 | ],
23 | "min_term_freq" : 1,
24 | "max_query_terms" : 12
25 | }
26 | }
27 | }
28 |
29 | # Limit the terms shown in the results. You may not necessarily want
30 | # to see ALL of the information returned by the "more like this"
31 | # query.
32 | POST /wikipedia/_search
33 | {
34 | "fields" : ["about"],
35 | "query": {
36 | "more_like_this" : {
37 | "fields" : ["name", "about", "description"],
38 | "like" : [
39 | {
40 | "_index" : "wikipedia",
41 | "_type" : "locations",
42 | "_id" : "northwestern_university_settlement_house"
43 | }
44 | ],
45 | "min_term_freq" : 1,
46 | "max_query_terms" : 12
47 | }
48 | }
49 | }
--------------------------------------------------------------------------------
/exercises/nginx/nginx.conf:
--------------------------------------------------------------------------------
1 | user nginx;
2 | worker_processes 1;
3 |
4 | pid /var/run/nginx.pid;
5 |
6 | events {
7 | worker_connections 1024;
8 | }
9 |
10 | http {
11 | types {
12 | text/css css;
13 | text/html htm html shtml;
14 | text/plain sense txt;
15 | application/json json map topojson;
16 | image/x-icon cur ico;
17 | }
18 |
19 | default_type application/octet-stream;
20 |
21 | log_format main '$remote_addr - $remote_user [$time_local] "$request" '
22 | '$status $body_bytes_sent "$http_referer" '
23 | '"$http_user_agent" "$http_x_forwarded_for"';
24 |
25 | keepalive_timeout 65;
26 |
27 | server {
28 | listen 80;
29 | server_name localhost;
30 |
31 | location / {
32 | root /usr/share/nginx/html;
33 | index index.html index.htm;
34 | add_header 'Access-Control-Allow-Origin' '*';
35 | add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
36 | }
37 |
38 | location /nginx {
39 | deny all;
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/exercises/percolators.sense:
--------------------------------------------------------------------------------
1 | # Percolators
2 | # ===========
3 |
4 | # Add a sample document.
5 | #
6 | PUT /spantree/team/cedric
7 | {
8 | "drinks": ["Red Bull"]
9 | }
10 |
11 | # Register a percolation query. Percolation queries allow you to
12 | # search in reverse. Instead of adding documents and then providing a
13 | # query, you add queries first and then provide documents to see which
14 | # queries they match. This is very useful for things like RSS feeds
15 | # and notification systems.
16 | #
17 | # Below are some examples based on a theoretical employee onboarding
18 | # process at Spantree, where we'd like to be notified if they modify
19 | # our scheduled amazon orders for various teas.
20 | #
21 | # First, we will register a percolator for people who like to drink
22 | # earl grey.
23 | #
24 | PUT /spantree/.percolator/earl_grey
25 | {
26 | "query" : {
27 | "match" : {
28 | "drinks": "earl grey"
29 | }
30 | }
31 | }
32 |
33 | # Add Percolator for Russian Caravan.
34 | #
35 | PUT /spantree/.percolator/russian_caravan
36 | {
37 | "query" : {
38 | "match" : {
39 | "drinks": "russian caravan"
40 | }
41 | }
42 | }
43 |
44 | # Onboard Justin with his drink preferences.
45 | #
46 | #
47 | GET /spantree/people/_percolate
48 | {
49 | "doc" : {
50 | "name": "Justin",
51 | "drinks": [
52 | "Triple Espresso",
53 | "Green Tea with Brown Rice",
54 | "Coconut Water"
55 | ]
56 | }
57 | }
58 |
59 | # Onboard Kevin with his drink preferences.
60 | #
61 | GET /spantree/people/_percolate
62 | {
63 | "doc" : {
64 | "name": "Kevin",
65 | "drinks": [
66 | "Sodastream Energy",
67 | "Dark Magic Coffee",
68 | "Earl Grey Tea"
69 | ]
70 | }
71 | }
72 |
73 | # Review the earl grey percolator.
74 | #
75 | GET /spantree/.percolator/earl_grey
76 |
77 | # Onboard Marija with her drink preferences.
78 | #
79 | #
80 | GET /spantree/people/_percolate
81 | {
82 | "doc": {
83 | "name": "Marija",
84 | "drinks": [
85 | "Earl Grey Tea",
86 | "Russian Caravan Tea",
87 | "Assam Tea"
88 | ]
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/images/download-docker-for-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/download-docker-for-mac.png
--------------------------------------------------------------------------------
/images/elasticsearch-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/elasticsearch-screenshot.png
--------------------------------------------------------------------------------
/images/inquisitor-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/inquisitor-screenshot.png
--------------------------------------------------------------------------------
/images/kibana-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/kibana-screenshot.png
--------------------------------------------------------------------------------
/images/kopf-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/kopf-screenshot.png
--------------------------------------------------------------------------------
/images/marvel-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/marvel-screenshot.png
--------------------------------------------------------------------------------
/images/sense-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/sense-screenshot.png
--------------------------------------------------------------------------------
/images/set-dfm-memory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/set-dfm-memory.png
--------------------------------------------------------------------------------
/images/slides-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/images/slides-screenshot.png
--------------------------------------------------------------------------------
/init-all-the-things.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -o errexit # exit when a command fails.
4 | set -o nounset # exit when your script tries to use undeclared variables
5 |
6 | wait_for_http_port() {
7 | port=$1
8 | while ! curl --output /dev/null --silent --head --fail http://localhost:$port; do
9 | sleep 5
10 | echo Waiting for port $port to be open, sleeping 5 seconds.
11 | done
12 | }
13 |
14 | # Pull all the necessary Docker containers
15 | docker-compose pull
16 | # Build the customized docker containers (installing plugins, etc)
17 | docker-compose build --pull
18 |
19 | # Bring up the containers that need to be initialized with
20 | # dependencies or data
21 | docker-compose up -d elastic1 elastic2 elastic3 slides
22 |
23 | # Wait for Elasticsearch cluster to be available
24 | for port in "9200 9201 9202"; do
25 | wait_for_http_port $port
26 | done
27 |
28 | # Restore sample data snapshots
29 | ./load-sample-snapshots.sh
30 |
31 | # Wait for slides to also be listening
32 | wait_for_http_port 9000
33 |
34 | # Stop all the services we brought up earlier
35 | docker-compose stop
36 |
37 | # Download all the sample data we will play around with
38 | ./download-sample-files.sh
39 |
--------------------------------------------------------------------------------
/kibana/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM kibana:4.6
2 |
3 | MAINTAINER Spantree Technology Group, LLC
4 |
5 | RUN kibana plugin -i elastic/sense \
6 | && kibana plugin -i elasticsearch/marvel/latest \
7 | && kibana plugin -i elastic/timelion \
8 | && kibana plugin -i logtrail -u https://github.com/sivasamyk/logtrail/releases/download/0.1.7/logtrail-4.x-0.1.7.tar.gz
9 |
--------------------------------------------------------------------------------
/kibana/config/kibana.yml:
--------------------------------------------------------------------------------
1 | # Kibana is served by a back end server. This controls which port to use.
2 | # server.port: 5601
3 |
4 | # The host to bind the server to.
5 | # server.host: "0.0.0.0"
6 |
7 | # If you are running kibana behind a proxy, and want to mount it at a path,
8 | # specify that path here. The basePath can't end in a slash.
9 | # server.basePath: ""
10 |
11 | # The maximum payload size in bytes on incoming server requests.
12 | # server.maxPayloadBytes: 1048576
13 |
14 | # The Elasticsearch instance to use for all your queries.
15 | elasticsearch.url: 'http://elastic1:9200'
16 | sense.defaultServerUrl: 'http://elastic1:9200'
17 |
18 | # preserve_elasticsearch_host true will send the hostname specified in `elasticsearch`. If you set it to false,
19 | # then the host you use to connect to *this* Kibana instance will be sent.
20 | # elasticsearch.preserveHost: true
21 |
22 | # Kibana uses an index in Elasticsearch to store saved searches, visualizations
23 | # and dashboards. It will create a new index if it doesn't already exist.
24 | # kibana.index: ".kibana"
25 |
26 | # The default application to load.
27 | # kibana.defaultAppId: "discover"
28 |
29 | # If your Elasticsearch is protected with basic auth, these are the user credentials
30 | # used by the Kibana server to perform maintenance on the kibana_index at startup. Your Kibana
31 | # users will still need to authenticate with Elasticsearch (which is proxied through
32 | # the Kibana server)
33 | # elasticsearch.username: "user"
34 | # elasticsearch.password: "pass"
35 |
36 | # SSL for outgoing requests from the Kibana Server to the browser (PEM formatted)
37 | # server.ssl.cert: /path/to/your/server.crt
38 | # server.ssl.key: /path/to/your/server.key
39 |
40 | # Optional setting to validate that your Elasticsearch backend uses the same key files (PEM formatted)
41 | # elasticsearch.ssl.cert: /path/to/your/client.crt
42 | # elasticsearch.ssl.key: /path/to/your/client.key
43 |
44 | # If you need to provide a CA certificate for your Elasticsearch instance, put
45 | # the path of the pem file here.
46 | # elasticsearch.ssl.ca: /path/to/your/CA.pem
47 |
48 | # Set to false to have a complete disregard for the validity of the SSL
49 | # certificate.
50 | # elasticsearch.ssl.verify: true
51 |
52 | # Time in milliseconds to wait for elasticsearch to respond to pings, defaults to
53 | # request_timeout setting
54 | # elasticsearch.pingTimeout: 1500
55 |
56 | # Time in milliseconds to wait for responses from the back end or elasticsearch.
57 | # This must be > 0
58 | # elasticsearch.requestTimeout: 30000
59 |
60 | # Header names and values that are sent to Elasticsearch. Any custom headers cannot be overwritten
61 | # by client-side headers.
62 | # elasticsearch.customHeaders: {}
63 |
64 | # Time in milliseconds for Elasticsearch to wait for responses from shards.
65 | # Set to 0 to disable.
66 | # elasticsearch.shardTimeout: 0
67 |
68 | # Time in milliseconds to wait for Elasticsearch at Kibana startup before retrying
69 | # elasticsearch.startupTimeout: 5000
70 |
71 | # Set the path to where you would like the process id file to be created.
72 | # pid.file: /var/run/kibana.pid
73 |
74 | # If you would like to send the log output to a file you can set the path below.
75 | # logging.dest: stdout
76 |
77 | # Set this to true to suppress all logging output.
78 | # logging.silent: false
79 |
80 | # Set this to true to suppress all logging output except for error messages.
81 | # logging.quiet: false
82 |
83 | # Set this to true to log all events, including system usage information and all requests.
84 | # logging.verbose: false
85 |
--------------------------------------------------------------------------------
/load-sample-snapshots.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -o xtrace # trace what gets executed
4 | set -o errexit # exit when a command fails.
5 | set -o nounset # exit when your script tries to use undeclared variables
6 |
7 | REPOSITORY_NAME=sample_readonly
8 |
9 | __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10 |
11 | # Create a read-only snapshot repository to pull files from S3 bucket via HTTPs
12 | curl -X PUT -d '{"type": "url", "settings": {"url": "https://elasticsearch-sample-data.s3.amazonaws.com/"}}' "http://localhost:9200/_snapshot/${REPOSITORY_NAME}"
13 |
14 | # Delete any existing indices
15 | curl -X DELETE "http://localhost:9200/*"
16 |
17 | # Read snapshots to restore from manifest file
18 | for SNAPSHOT_NAME in $(cat ./snapshot-manifest); do
19 | # Restore snapshots with one replica
20 | time curl -X POST -d '{"index_settings": {"index.number_of_replicas": 1}}' "http://localhost:9200/_snapshot/${REPOSITORY_NAME}/${SNAPSHOT_NAME}/_restore?wait_for_completion=true"
21 | done
22 |
--------------------------------------------------------------------------------
/logstash/logstash-es-template.json:
--------------------------------------------------------------------------------
1 | {
2 | "template": "logstash-*",
3 | "settings" : {
4 | "number_of_shards" : 1,
5 | "number_of_replicas" : 1,
6 | "index" : {
7 | "query" : { "default_field" : "@message" },
8 | "store" : { "compress" : { "stored" : true, "tv": true } }
9 | },
10 | "analysis": {
11 | "analyzer": {
12 | "url_analyzer": {
13 | "type": "custom",
14 | "tokenizer": "uax_url_email"
15 | }
16 | }
17 | }
18 | },
19 | "mappings": {
20 | "_default_": {
21 | "_all" : {"enabled" : false},
22 | "dynamic_templates": [
23 | {
24 | "string_template" : {
25 | "match" : "*",
26 | "mapping": { "type": "string", "index": "not_analyzed" },
27 | "match_mapping_type" : "string"
28 | }
29 | }
30 | ],
31 | "properties" : {
32 | "@message" : { "type" : "string", "index" : "analyzed" },
33 | "@source" : { "type" : "string", "index" : "not_analyzed" },
34 | "@source_host" : { "type" : "string", "index" : "not_analyzed" },
35 | "@source_path" : { "type" : "string", "index" : "not_analyzed" },
36 | "@tags": { "type": "string", "index" : "not_analyzed" },
37 | "@timestamp" : { "type" : "date", "index" : "not_analyzed" },
38 | "@type" : { "type" : "string", "index" : "not_analyzed" },
39 | "http_referrer" : { "type": "string", "analyzer": "url_analyzer"},
40 | "geoip": {
41 | "properties": {
42 | "location": {
43 | "type": "geo_point",
44 | "geohash_prefix": true,
45 | "geohash_precision": "1km"
46 | }
47 | }
48 | }
49 | }
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/logstash/logstash.conf:
--------------------------------------------------------------------------------
1 | input {
2 | tcp {
3 | port => 3333
4 | type => "apache_access"
5 | }
6 | beats {
7 | port => 5044
8 | }
9 | }
10 |
11 | filter {
12 | mutate {
13 | add_field => [ "host_ip", "%{host}" ]
14 | }
15 |
16 | # Uncomment the remainder of the line to allow the "datadumpbeat" to
17 | # be managed in a similar way to normal Apache logs
18 |
19 | if [type] == "apache_access" # or [type] == "datadumpbeat"
20 | {
21 | grok {
22 | match => {
23 | message => "%{IPORHOST:remote_addr} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{NOTSPACE:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:status} (?:%{NUMBER:bytes}|-) \"(?:%{URI:referrer}|-)\" %{QS:user_agent}"
24 | }
25 | }
26 |
27 | date {
28 | locale => "en"
29 | match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
30 | }
31 |
32 | mutate {
33 | remove_field => "timestamp"
34 | gsub => [
35 | "user_agent", "(^\"|\"$)", ""
36 | ]
37 | }
38 |
39 | useragent {
40 | source => "user_agent"
41 | prefix => "user_agent_"
42 | }
43 |
44 | geoip {
45 | source => "remote_addr"
46 | target => "geoip"
47 | database =>"/usr/local/share/data/GeoLiteCity.dat"
48 | add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
49 | add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
50 | }
51 |
52 | mutate {
53 | convert => [ "[geoip][coordinates]", "float" ]
54 | }
55 | }
56 | }
57 |
58 | # Uncomment for detailed logstash mapping information
59 | # which can be viewed via `docker-compose logs -f logstash`
60 | #
61 | # output {
62 | # stdout { codec => rubydebug }
63 | # }
64 |
65 | output {
66 | elasticsearch {
67 | hosts => ["elastic1", "elastic2", "elastic3"]
68 | template => "/config-dir/logstash-es-template.json"
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/presentation/sections/query.md:
--------------------------------------------------------------------------------
1 | ## Querying
2 |
3 |
4 | ### Search API
5 |
6 | ```bash
7 | curl -XGET http://esdemo.local:9200/wikipedia/_search?q=about:lake
8 | ```
9 |
10 | or
11 |
12 | ```bash
13 | curl -XPOST "http://esdemo.local:9200/wikipedia/_search" -d '{
14 | "query" : {
15 | "term" : { "about" : "lake" }
16 | }
17 | }'
18 | ```
19 |
20 |
21 | ### Types of Queries
22 |
23 |
24 | match multi match bool
25 |
26 | boosting common terms constant score
27 | dis max filtered fuzzy like this
28 | fuzzy like this field function score fuzzy
29 | geoshape has child has parent
30 | ids indices match all
31 | more like this more like this field nested
32 | prefix query_string simple query
33 | range regexp span first
34 | span multi term span near span not
35 | span or span term term
36 | terms top children wildcard
37 | minimum should match multi term query rewrite
38 |
39 |
40 |
41 | ### Search Demos
42 |
43 | [Searching Exercises](sense://searching.sense)
44 |
45 |
46 | ### How is it so fast?
47 | * Interesting data structure
48 |
49 |
50 | ### Inverted index
51 |
52 |
58 |
59 |
60 | ### Explaining queries
61 |
62 |
63 | ### How does it know which document is most relevant?
64 |
65 | * ...Math?
66 |
67 |
68 | ### Simple scoring
69 |
70 | * Make vectors of scores
71 | * Finds angle between vectors of scores
72 | * (Cosine similarity)
73 |
74 |
75 | ### Classic example: TF-IDF
76 | $tf \times idf = tf \times \log{ \frac{N}{df} }$
77 |
78 | * **term frequency ($tf$)** number of times a term occurs in a particular document
79 | * **document frequency ($df$)** number of all documents a term occurs in
80 | * **inverse document frequency ($idf$)** is (usually) $\log{\frac{N}{df}}$, where $N$ is the number of documents in the index
81 |
82 |
83 | ### Scoring demo
84 |
85 |
86 |
87 |
88 |
89 | ### In Lucene...
90 |
91 |
92 | ### Practical Scoring Function
93 | $s = coord \times \sum_{t} (qn \times boost \times idf) \times (tf \times idf \times fn)$
94 |
95 | * **qn (queryNorm)** - tries to make results of different queries comparable
96 | * **coord** - coord, boosts documents that contain more of the query
97 | * **boost** - boosts value of a term in the query
98 | * **fn (fieldNorm)** - boosts score when matching shorter fields
99 |
100 |
101 | ### More on scoring
102 |
103 | * Modified via boosting
104 | * Can rewrite scoring algorithm
105 | * Can use alternative scoring algorithms (Okapi BM25, etc)
106 |
107 |
108 | ### Filtering
109 |
110 |
111 | ### Queries vs Filters
112 |
113 | 
114 |
115 |
116 | ### Queries vs Filters
117 |
118 |
119 |
120 | Queries
121 | Filters
122 |
123 |
124 | Scored
125 | Boolean
126 |
127 |
128 | Slower
129 | Faster
130 |
131 |
132 | Never cached
133 | Cacheable
134 |
135 |
136 |
137 |
138 | ### Filtering Demos
139 |
140 | [API Examples](sense://searching.sense#L81)
141 |
--------------------------------------------------------------------------------
/slides/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "bower_components"
3 | }
4 |
--------------------------------------------------------------------------------
/slides/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 4
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
--------------------------------------------------------------------------------
/slides/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | bower_components
3 | dist
4 | *.log
5 | .sass-cache
6 | /index.html
7 |
--------------------------------------------------------------------------------
/slides/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "esnext": false,
3 | "bitwise": true,
4 | "camelcase": true,
5 | "curly": true,
6 | "eqeqeq": true,
7 | "immed": true,
8 | "indent": 4,
9 | "latedef": true,
10 | "newcap": true,
11 | "noarg": true,
12 | "quotmark": "single",
13 | "undef": true,
14 | "unused": true,
15 | "strict": true,
16 | "trailing": true,
17 | "smarttabs": true,
18 | "white": true
19 | }
20 |
--------------------------------------------------------------------------------
/slides/.yo-rc.json:
--------------------------------------------------------------------------------
1 | {
2 | "generator-reveal": {
3 | "presentationTitle": "Elasticsearch",
4 | "packageVersion": "2.0.0",
5 | "useSass": true,
6 | "deployToGithubPages": true,
7 | "githubUsername": "Spantree",
8 | "githubRepository": "elasticsearch-slides"
9 | }
10 | }
--------------------------------------------------------------------------------
/slides/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM spantree/reveal:3.4.0-onbuild
2 |
--------------------------------------------------------------------------------
/slides/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "elasticsearch",
3 | "version": "2.0.0",
4 | "dependencies": {
5 | "angularjs": "~1.3.0",
6 | "d3": "~3.5.0",
7 | "font-awesome": "4.7.0",
8 | "highlightjs": "~9.0.0",
9 | "MathJax": "~2.7.0",
10 | "packery": "2.1.1",
11 | "reveal.js": "~3.3.0",
12 | "jquery": "1.7.1"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/slides/css/ix-illustration.css:
--------------------------------------------------------------------------------
1 | .ix-illustration .document-panel {
2 | height: 500px;
3 | overflow-y: scroll;
4 | padding: 30px;
5 | color: #555
6 | }
7 |
8 | .ix-illustration .document-panel-item {
9 | padding-bottom: 5px;
10 | height: 100px;
11 | }
12 |
13 | .ix-illustration .document-panel-item span {
14 | font-size: 14pt;
15 | }
16 |
17 | .ix-illustration .document-item {
18 | font-size: 18pt;
19 | line-height: 28pt;
20 | font-weight: bold;
21 | height: 60px;
22 | }
23 |
24 | .ix-illustration .document-item em {
25 | background-color: #ddd;
26 | }
27 |
28 | .ix-illustration .radio-inline {
29 | font-size: 50%;
30 | line-height: 100%;
31 | padding-right: 10px;
32 | }
33 |
34 | .ix-illustration .checkbox-inline {
35 | font-size: 50%;
36 | line-height: 100%;
37 | }
38 |
39 | .ix-illustration table {
40 | font-size: 70%;
41 | }
42 |
43 | .ix-illustration table .entry-highlighted {
44 | cursor: pointer;
45 | font-weight: bold;
46 | }
47 |
48 | .ix-illustration button {
49 | margin-top: 30px;
50 | }
51 |
--------------------------------------------------------------------------------
/slides/css/kopf-custom.css:
--------------------------------------------------------------------------------
1 | body,
2 | .box {
3 | background-color: #ecf0f1;
4 | color: #2c3e50;
5 | font-family: -apple-system, BlinkMacSystemFont, 'Open Sans', Helvetica, sans-serif;
6 | }
7 | .fa-caret-down {
8 | display: none;
9 | }
10 | table,
11 | td,
12 | th {
13 | border: 0px;
14 | }
15 | span.shard.shard-primary:before {
16 | content: 'P';
17 | }
18 | span.shard.shard-primary.shard-started {
19 | background-color: #27ae60;
20 | color: #ecf0f1;
21 | font-weight: 500;
22 | }
23 | tr {
24 | height: 125px;
25 | }
26 | .shard-started:before {
27 | content: 'R';
28 | }
29 | .shard-started {
30 | background-color: #2c3e50;
31 | color: #ecf0f1;
32 | font-size: 2em;
33 | height: 2em;
34 | width: 3em;
35 | vertical-align: middle;
36 | text-align: center;
37 | padding: 0.6em 0;
38 | border-radius: 5px;
39 | border: none;
40 | letter-spacing: -0.06em;
41 | }
42 | th span.cluster-map-header-index-name:before {}span.cluster-map-header-index-name:before {}span.cluster-map-node-detail:before {}.node-info,
43 | span.cluster-map-header-index-name {
44 | font-size: 2em;
45 | line-height: 1.4em;
46 | text-align: center;
47 | margin: 0;
48 | }
49 | .cluster-map-header-cluster-actions {
50 | width: 10em;
51 | }
52 | span.cluster-map-node-detail {
53 | font-size: 1em;
54 | font-weight: 100;
55 | }
56 | .node-badges {
57 | padding-top: 20px;
58 | width: 8em;
59 | }
60 | i {
61 | width: 100px;
62 | }
63 | .fa-star,
64 | .fa-star-o {}.fa-star:after {
65 | content: " (Master)";
66 | font-family: -apple-system, BlinkMacSystemFont, 'Open Sans', Helvetica, sans-serif;
67 | }
68 | .fa-star-o:after {
69 | content: " (Follower)";
70 | font-family: -apple-system, BlinkMacSystemFont, 'Open Sans', Helvetica, sans-serif;
71 | }
72 | .fa-hdd-o:after {
73 | content: " (Data Node)";
74 | font-family: -apple-system, BlinkMacSystemFont, 'Open Sans', Helvetica, sans-serif;
75 | }
76 | th span.cluster-map-header-index-name {
77 | font-size: 2em;
78 | line-height: 2em;
79 | text-align: center;
80 | }
81 | .cluster-map-header-index-alias {
82 | font-size: 1.5em;
83 | text-align: center;
84 | font-weight: 100;
85 | }
86 | .table-header {
87 | width: 420px;
88 | }
89 | .navbar,
90 | .cluster-map-header-cluster-actions,
91 | .node-progress-bar,
92 | .stat-block,
93 | .cluster-overview-filter,
94 | .page-ctrl,
95 | div[ng-controller="DebugController"] {
96 | visibility: hidden;
97 | }
98 |
--------------------------------------------------------------------------------
/slides/css/source/flat-ui-colors.min.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/css/source/flat-ui-colors.min.css
--------------------------------------------------------------------------------
/slides/css/source/flat-ui-colors.scss:
--------------------------------------------------------------------------------
1 | $flat-turquoise: #1ABC9C;
2 | $flat-green-sea: #16A085;
3 | $flat-emerald: #2ECC71;
4 | $flat-nephritis: #27AE60;
5 |
6 | // Blues
7 | $flat-peter-river: #3498DB;
8 | $flat-belize-hole: #2980B9;
9 | $flat-wet-asphalt: #34495E;
10 | $flat-midnight-blue: #2C3E50;
11 |
12 | // Purples
13 | $flat-amethyst: #9B59B6;
14 | $flat-wisteria: #8E44AD;
15 |
16 | // Yellows
17 | $flat-sunflower: #F1C40F;
18 |
19 | // Oranges
20 | $flat-orange: #F39C12;
21 | $flat-carrot: #E67E22;
22 | $flat-pumpkin: #D35400;
23 |
24 | // Reds
25 | $flat-alizarin: #E74C3C;
26 | $flat-pomegranate: #C0392B;
27 |
28 | // Grays
29 | $flat-clouds: #ECF0F1;
30 | $flat-silver: #BDC3C7;
31 | $flat-concrete: #95A5A6;
32 | $flat-asbestos: #7F8C8D;
33 |
34 | // Aliases make colors easier to remember.
35 |
36 | // Greens
37 | $flat-green-1: $flat-turquoise;
38 | $flat-green-2: $flat-green-sea;
39 | $flat-green-3: $flat-emerald;
40 | $flat-green-4: $flat-nephritis;
41 |
42 | // Blues
43 | $flat-blue-1: $flat-peter-river;
44 | $flat-blue-2: $flat-belize-hole;
45 | $flat-blue-3: $flat-wet-asphalt;
46 | $flat-blue-4: $flat-midnight-blue;
47 |
48 | // Purples
49 | $flat-purple-1: $flat-amethyst;
50 | $flat-purple-2: $flat-wisteria;
51 |
52 | // Yellows
53 | $flat-yellow-1: $flat-sunflower;
54 |
55 | // Oranges
56 | $flat-orange-1: $flat-orange;
57 | $flat-orange-2: $flat-carrot;
58 | $flat-orange-3: $flat-pumpkin;
59 |
60 | // Refs
61 | $flat-red-1: $flat-alizarin;
62 | $flat-red-2: $flat-pomegranate;
63 |
64 | // Grays
65 | $flat-gray-1: $flat-clouds;
66 | $flat-gray-2: $flat-silver;
67 | $flat-gray-3: $flat-concrete;
68 | $flat-gray-4: $flat-asbestos;
69 |
--------------------------------------------------------------------------------
/slides/images/JavaApiInstall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/JavaApiInstall.png
--------------------------------------------------------------------------------
/slides/images/ab-results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/ab-results.png
--------------------------------------------------------------------------------
/slides/images/airbnb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/airbnb.png
--------------------------------------------------------------------------------
/slides/images/allie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/allie.png
--------------------------------------------------------------------------------
/slides/images/amazon-java.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/amazon-java.png
--------------------------------------------------------------------------------
/slides/images/andrea.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/andrea.png
--------------------------------------------------------------------------------
/slides/images/angular.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/angular.png
--------------------------------------------------------------------------------
/slides/images/animations/lucene-merge-concurrent.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/animations/lucene-merge-concurrent.gif
--------------------------------------------------------------------------------
/slides/images/animations/lucene-merge-tiered.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/animations/lucene-merge-tiered.gif
--------------------------------------------------------------------------------
/slides/images/aphyr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/aphyr.png
--------------------------------------------------------------------------------
/slides/images/arena.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/arena.png
--------------------------------------------------------------------------------
/slides/images/asgard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/asgard.png
--------------------------------------------------------------------------------
/slides/images/automatic-mapping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/automatic-mapping.png
--------------------------------------------------------------------------------
/slides/images/backbone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/backbone.png
--------------------------------------------------------------------------------
/slides/images/backbone.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | BackBone.JS
4 | Created with Sketch (http://www.bohemiancoding.com/sketch)
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/slides/images/blue.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/slides/images/bob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/bob.png
--------------------------------------------------------------------------------
/slides/images/book-index.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/book-index.png
--------------------------------------------------------------------------------
/slides/images/carrot2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/carrot2.gif
--------------------------------------------------------------------------------
/slides/images/carrot2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/carrot2.png
--------------------------------------------------------------------------------
/slides/images/cedric.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/cedric.png
--------------------------------------------------------------------------------
/slides/images/channelcompany.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/channelcompany.gif
--------------------------------------------------------------------------------
/slides/images/chicago-cubs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/chicago-cubs.png
--------------------------------------------------------------------------------
/slides/images/chicago-sun-times.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/chicago-sun-times.png
--------------------------------------------------------------------------------
/slides/images/chicagocom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/chicagocom.png
--------------------------------------------------------------------------------
/slides/images/conference-solutions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/conference-solutions.png
--------------------------------------------------------------------------------
/slides/images/cote-tweet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/cote-tweet.png
--------------------------------------------------------------------------------
/slides/images/crn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/crn.png
--------------------------------------------------------------------------------
/slides/images/cubs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/cubs.png
--------------------------------------------------------------------------------
/slides/images/datascope.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/datascope.png
--------------------------------------------------------------------------------
/slides/images/dena.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/dena.png
--------------------------------------------------------------------------------
/slides/images/diagrams/analysis-chain-with-background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/analysis-chain-with-background.png
--------------------------------------------------------------------------------
/slides/images/diagrams/analysis-chain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/analysis-chain.png
--------------------------------------------------------------------------------
/slides/images/diagrams/beats-logstash-es-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/beats-logstash-es-flow.png
--------------------------------------------------------------------------------
/slides/images/diagrams/bm25-calculation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/bm25-calculation.png
--------------------------------------------------------------------------------
/slides/images/diagrams/bm25-formula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/bm25-formula.png
--------------------------------------------------------------------------------
/slides/images/diagrams/cluster-topology.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/cluster-topology.png
--------------------------------------------------------------------------------
/slides/images/diagrams/deep-pagination-problem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/deep-pagination-problem.png
--------------------------------------------------------------------------------
/slides/images/diagrams/highschoolcube.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/highschoolcube.png
--------------------------------------------------------------------------------
/slides/images/diagrams/merge-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/merge-flow.png
--------------------------------------------------------------------------------
/slides/images/diagrams/numeric-trie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/numeric-trie.png
--------------------------------------------------------------------------------
/slides/images/diagrams/panera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/panera.png
--------------------------------------------------------------------------------
/slides/images/diagrams/query-request-data-flow.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/query-request-data-flow.jpeg
--------------------------------------------------------------------------------
/slides/images/diagrams/relational-vs-document-model.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/relational-vs-document-model.png
--------------------------------------------------------------------------------
/slides/images/diagrams/relational-vs-nonrelational.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/relational-vs-nonrelational.jpg
--------------------------------------------------------------------------------
/slides/images/diagrams/segment-file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/segment-file.png
--------------------------------------------------------------------------------
/slides/images/diagrams/segment-hierarchy.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/segment-hierarchy.jpeg
--------------------------------------------------------------------------------
/slides/images/diagrams/split-brain.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/split-brain.jpeg
--------------------------------------------------------------------------------
/slides/images/diagrams/write-request-data-flows.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/diagrams/write-request-data-flows.jpeg
--------------------------------------------------------------------------------
/slides/images/divvy-data-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/divvy-data-dashboard.png
--------------------------------------------------------------------------------
/slides/images/doejo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/doejo.png
--------------------------------------------------------------------------------
/slides/images/dojo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/slides/images/elastic-favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/elastic-favicon.ico
--------------------------------------------------------------------------------
/slides/images/elastic-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/elastic-white.png
--------------------------------------------------------------------------------
/slides/images/elastic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/elastic.png
--------------------------------------------------------------------------------
/slides/images/elasticsearch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/elasticsearch.png
--------------------------------------------------------------------------------
/slides/images/elk-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/elk-flow.png
--------------------------------------------------------------------------------
/slides/images/es-big-data-github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/es-big-data-github.png
--------------------------------------------------------------------------------
/slides/images/es-configurable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/es-configurable.png
--------------------------------------------------------------------------------
/slides/images/es-github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/es-github.png
--------------------------------------------------------------------------------
/slides/images/es-karmi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/es-karmi.png
--------------------------------------------------------------------------------
/slides/images/es-shakespeare-json.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/es-shakespeare-json.png
--------------------------------------------------------------------------------
/slides/images/fluentd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/fluentd.png
--------------------------------------------------------------------------------
/slides/images/flume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/flume.png
--------------------------------------------------------------------------------
/slides/images/gary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/gary.png
--------------------------------------------------------------------------------
/slides/images/gatling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/gatling.png
--------------------------------------------------------------------------------
/slides/images/gohealth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/gohealth.png
--------------------------------------------------------------------------------
/slides/images/green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/green.png
--------------------------------------------------------------------------------
/slides/images/healthgrades.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/healthgrades.png
--------------------------------------------------------------------------------
/slides/images/highschoolcube.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/highschoolcube.png
--------------------------------------------------------------------------------
/slides/images/hostedbuyer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/hostedbuyer.png
--------------------------------------------------------------------------------
/slides/images/humio.svg:
--------------------------------------------------------------------------------
1 | Artboard 1
--------------------------------------------------------------------------------
/slides/images/intermission.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/intermission.jpg
--------------------------------------------------------------------------------
/slides/images/java.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/slides/images/jenkins.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/jenkins.png
--------------------------------------------------------------------------------
/slides/images/jerry.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/jerry.png
--------------------------------------------------------------------------------
/slides/images/jmeter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/jmeter.png
--------------------------------------------------------------------------------
/slides/images/jon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/jon.png
--------------------------------------------------------------------------------
/slides/images/kevin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/kevin.png
--------------------------------------------------------------------------------
/slides/images/kibana-4-waxy-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/kibana-4-waxy-dashboard.png
--------------------------------------------------------------------------------
/slides/images/kibana.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/kibana.png
--------------------------------------------------------------------------------
/slides/images/kimchy.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/kimchy.jpeg
--------------------------------------------------------------------------------
/slides/images/less-css.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/less-css.png
--------------------------------------------------------------------------------
/slides/images/logo_bw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/logo_bw.png
--------------------------------------------------------------------------------
/slides/images/logos/beats.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/logos/beats.png
--------------------------------------------------------------------------------
/slides/images/logstash-search-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/logstash-search-screenshot.png
--------------------------------------------------------------------------------
/slides/images/logstash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/logstash.png
--------------------------------------------------------------------------------
/slides/images/lucene.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/lucene.png
--------------------------------------------------------------------------------
/slides/images/malynda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/malynda.png
--------------------------------------------------------------------------------
/slides/images/marionettejs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/marionettejs.png
--------------------------------------------------------------------------------
/slides/images/mileiq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/mileiq.png
--------------------------------------------------------------------------------
/slides/images/mobiquity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/mobiquity.png
--------------------------------------------------------------------------------
/slides/images/mongodb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/mongodb.png
--------------------------------------------------------------------------------
/slides/images/nemik.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/nemik.png
--------------------------------------------------------------------------------
/slides/images/neo4j.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | 2012-06-24 15:52Z Canvas 1 Layer 1
4 |
--------------------------------------------------------------------------------
/slides/images/nmh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/nmh.gif
--------------------------------------------------------------------------------
/slides/images/northwestern-medicine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/northwestern-medicine.png
--------------------------------------------------------------------------------
/slides/images/nutch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/nutch.png
--------------------------------------------------------------------------------
/slides/images/packer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/packer.png
--------------------------------------------------------------------------------
/slides/images/panera-bread.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/panera-bread.png
--------------------------------------------------------------------------------
/slides/images/panera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/panera.png
--------------------------------------------------------------------------------
/slides/images/pds-life-sciences.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/pds-life-sciences.gif
--------------------------------------------------------------------------------
/slides/images/percolator.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/percolator.gif
--------------------------------------------------------------------------------
/slides/images/phosphor.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/phosphor.jpg
--------------------------------------------------------------------------------
/slides/images/raise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/raise.png
--------------------------------------------------------------------------------
/slides/images/red-and-green-ornaments.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/red-and-green-ornaments.jpg
--------------------------------------------------------------------------------
/slides/images/red-green-m-m.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/red-green-m-m.jpg
--------------------------------------------------------------------------------
/slides/images/red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/red.png
--------------------------------------------------------------------------------
/slides/images/red_green.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/red_green.jpg
--------------------------------------------------------------------------------
/slides/images/reverb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/reverb.png
--------------------------------------------------------------------------------
/slides/images/roberto.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/roberto.png
--------------------------------------------------------------------------------
/slides/images/rocketmiles.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/rocketmiles.png
--------------------------------------------------------------------------------
/slides/images/rsyslog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/rsyslog.png
--------------------------------------------------------------------------------
/slides/images/scala.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/scala.png
--------------------------------------------------------------------------------
/slides/images/screenshots/ab-results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/ab-results.png
--------------------------------------------------------------------------------
/slides/images/screenshots/aphyr-strangeloop-talk.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/aphyr-strangeloop-talk.jpg
--------------------------------------------------------------------------------
/slides/images/screenshots/elastic-security.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/elastic-security.png
--------------------------------------------------------------------------------
/slides/images/screenshots/elasticsearch-github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/elasticsearch-github.png
--------------------------------------------------------------------------------
/slides/images/screenshots/kibana-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/kibana-screenshot.png
--------------------------------------------------------------------------------
/slides/images/screenshots/kopf-node-failure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/kopf-node-failure.png
--------------------------------------------------------------------------------
/slides/images/screenshots/kopf-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/kopf-screenshot.png
--------------------------------------------------------------------------------
/slides/images/screenshots/searchkit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/screenshots/searchkit.png
--------------------------------------------------------------------------------
/slides/images/shay-bannon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/shay-bannon.jpg
--------------------------------------------------------------------------------
/slides/images/simian-army.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/simian-army.png
--------------------------------------------------------------------------------
/slides/images/simplicity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/simplicity.png
--------------------------------------------------------------------------------
/slides/images/spantree-silver.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/spantree-silver.png
--------------------------------------------------------------------------------
/slides/images/spantree-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/spantree-white.png
--------------------------------------------------------------------------------
/slides/images/spark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/spark.png
--------------------------------------------------------------------------------
/slides/images/tcc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/tcc.jpg
--------------------------------------------------------------------------------
/slides/images/team.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/team.jpg
--------------------------------------------------------------------------------
/slides/images/vagrant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/vagrant.png
--------------------------------------------------------------------------------
/slides/images/vault.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
9 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/slides/images/wrapports.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/wrapports.png
--------------------------------------------------------------------------------
/slides/images/yello.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/slides/images/yello.png
--------------------------------------------------------------------------------
/slides/js/loadhtmlslides.js:
--------------------------------------------------------------------------------
1 | // Modified from markdown.js from Hakim to handle external html files
2 | (function () {
3 | /*jslint loopfunc: true, browser: true*/
4 | /*globals alert*/
5 | 'use strict';
6 |
7 | var querySlidingHtml = function () {
8 | var sections = document.querySelectorAll('[data-html]'),
9 | section, j, jlen;
10 |
11 | for (j = 0, jlen = sections.length; j < jlen; j++) {
12 | section = sections[j];
13 |
14 | if (section.getAttribute('data-html').length) {
15 |
16 | var xhr = new XMLHttpRequest(),
17 | url = section.getAttribute('data-html'),
18 | cb = function () {
19 | if (xhr.readyState === 4) {
20 | if (
21 | (xhr.status >= 200 && xhr.status < 300) ||
22 | xhr.status === 0 // file protocol yields status code 0 (useful for local debug, mobile applications etc.)
23 | ) {
24 | section.innerHTML = xhr.responseText;
25 | } else {
26 | section.outerHTML = 'ERROR: The attempt to fetch ' + url + ' failed with the HTTP status ' + xhr.status + '. Check your browser\'s JavaScript console for more details.
';
27 | }
28 | }
29 | };
30 |
31 | xhr.onreadystatechange = cb;
32 |
33 | xhr.open('GET', url, false);
34 | try {
35 | xhr.send();
36 | } catch (e) {
37 | alert('Failed to get file' + url + '.' + e);
38 | }
39 | }
40 | }
41 | };
42 |
43 | querySlidingHtml();
44 | })();
45 |
--------------------------------------------------------------------------------
/slides/js/markdown-customizations.js:
--------------------------------------------------------------------------------
1 | /* jslint browser: true, asi: true, semi: false */
2 | (function() {
3 | 'use strict';
4 |
5 | var customizeMarkdown = function (marked) {
6 | var md = marked.Renderer.prototype;
7 |
8 | md.image = function (href, title, text) {
9 | var split = href.split('#');
10 | var classes = split[1] ? split[1].replace(/[\s,]/, ' ') : '';
11 | var strippedHref = split[0];
12 | var out = ' ' : '>';
20 | return out;
21 | };
22 |
23 | md.link = function(href, title, text) {
24 | var activeProtocol = '';
25 | if(window.mdProtocols) {
26 | for(var protocol in window.mdProtocols) {
27 | if(href.startsWith(protocol)) {
28 | activeProtocol = protocol;
29 | href = href.replace(protocol, window.mdProtocols[protocol]);
30 | break;
31 | }
32 | }
33 | }
34 | var out = '' + text + ' ';
41 | return out;
42 | }
43 | };
44 |
45 | customizeMarkdown(window.marked);
46 | }());
47 |
--------------------------------------------------------------------------------
/slides/js/templates/_invindex.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Documents
5 |
6 |
7 |
{{docKey}}
8 |
9 |
10 |
11 |
12 |
Build Index
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | Word
23 |
24 |
25 | Document
26 |
27 |
28 | Positions
29 |
30 |
31 |
32 |
33 | {{entry.word}}
34 |
35 |
36 | {{document}}
37 |
38 |
39 | {{words.join(', ')}}
40 |
41 |
42 |
43 |
44 | {{document}}
45 |
46 |
47 | {{words.join(', ')}}
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/slides/js/templates/_scoring.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Documents
5 |
6 |
7 |
{{docKey}}
8 |
9 |
10 |
11 |
12 |
Build Index
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | TF-IDF
24 |
25 |
26 | Cos Similarity
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | {{word}}
35 |
36 |
37 |
38 | {{docKey}}
39 |
40 |
41 |
42 |
43 | {{tfidfScores[docKey][word] | number:2}}
44 |
45 |
46 |
47 |
48 |
49 | Show formulas
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | Formula
59 |
60 |
61 | Similarity
62 |
63 |
64 |
65 |
66 | {{docKey}}
67 |
68 |
69 |
70 |
71 |
72 |
73 | {{getCosSimValue(docKey) | number:2 }}
74 |
75 |
76 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/slides/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "elasticsearch",
3 | "version": "2.0.0",
4 | "private": true,
5 | "devDependencies": {
6 | "grunt": "^1.0.0",
7 | "grunt-sass": "^2.0.0",
8 | "grunt-contrib-connect": "^1.0.2",
9 | "grunt-contrib-watch": "^1.0.0",
10 | "grunt-contrib-copy": "^1.0.0",
11 | "grunt-contrib-jshint": "^1.1.0",
12 | "load-grunt-tasks": "^3.5.2",
13 | "grunt-build-control": "^0.7.1",
14 | "grunt-coffeelint": "0.0.16",
15 | "coffeelint": "^1.16.0"
16 | },
17 | "engines": {
18 | "node": ">=4"
19 | },
20 | "repository": {
21 | "type": "git",
22 | "url": "git@github.com:Spantree/elasticsearch-slides.git"
23 | },
24 | "scripts": {
25 | "test": "grunt test"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/slides/resources/.gitkeep:
--------------------------------------------------------------------------------
1 | Used to store static assets
--------------------------------------------------------------------------------
/slides/slides/advanced-querying.md:
--------------------------------------------------------------------------------
1 | ## Query Options
2 |
3 | ---
4 |
5 | ### Pagination
6 |
7 | * Most cases use `size` and `from`
8 | * [Simple Paging](sense://paging-and-sorting.sense#L4)
9 |
10 | * Option of using a cursor
11 | * [Paging with a Scroll ID](sense://paging-and-sorting.sense#L41)
12 |
13 | ---
14 |
15 | ### Sorting - What you expect
16 |
17 | * Sort most fields by ascending or descending
18 |
19 | [Basic Sorting](sense://paging-and-sorting.sense#L72)
20 |
21 | ---
22 |
23 | ### Sorting - What you don't expect
24 |
25 | * Tokenizers affect sorting as well
26 | * Need to make sure you are sorting on the right field
27 |
28 | [Sorting String Fields](sense://paging-and-sorting.sense#L131)
29 |
--------------------------------------------------------------------------------
/slides/slides/aggregations.md:
--------------------------------------------------------------------------------
1 | ## Aggregations
2 |
3 | ---
4 |
5 | ### Buckets vs Metrics
6 |
7 | * Buckets - Classify your data
8 | * Metrics - Analyze your data
9 |
10 | ---
11 |
12 | ### Buckets
13 |
14 | * **Terms** - Break up the data based on text / keywords
15 | * [Terms Aggregations Examples](sense://aggregations.sense)
16 |
17 | * **Histograms** - Define an interval to break up the data
18 | * [Histogram Examples](sense://aggregations.sense#L115)
19 |
20 | ---
21 |
22 | ### Custom Buckets
23 |
24 | * Bucket by defined ranges
25 |
26 | [Range Bucket Examples](sense://aggregations.sense#L88)
27 |
28 | ---
29 |
30 | ### Metrics - Statistics
31 |
32 | * **Stats** - Common statistics for your data
33 | * **Extended Stats** - More statistics for your data
34 | * [Statistics Examples](sense://aggregations.sense#L24)
35 |
36 | ---
37 |
38 | ### Metrics - Percentiles
39 |
40 | * Approximate, not exact
41 | * Still incredibly good
42 | * [Percentiles Examples](sense://aggregations.sense#L48)
43 |
44 | ---
45 |
46 | ### Aggregations as a User Experience
47 |
48 | * [Accelerate77 Example](http://accelerate77.spantree.net)
49 |
50 | ---
51 |
52 | ### Terms Facets
53 |
54 | * Enable visual filters
55 | * Better inform choices
56 |
57 | ---
58 |
59 | ### Top Hits
60 |
61 | * Meld two types of products
62 | * Create Google Ads-esque design with one query
63 |
64 | * [Top Hits Example](sense://aggregations.sense#L147)
65 |
66 | ---
67 |
68 | ### Sub-aggregations
69 |
70 | * Enables processing of several different facets in memory
71 | * Enables complex graphs and visualizations
72 | * [Sub-aggregations Example](sense://aggregations.sense#L182)
73 |
--------------------------------------------------------------------------------
/slides/slides/clustering.md:
--------------------------------------------------------------------------------
1 | ## Cluster Design
2 |
3 |
22 |
23 | ---
24 |
25 | ### Terminology
26 |
27 | ---
28 |
29 | ### Primary shard
30 |
31 | * Where documents are indexed
32 | * Quantity can only be set at index creation
33 |
34 | ---
35 |
36 | ### Replica shard
37 |
38 | * Gets updates from primary shard
39 | * Handles queries
40 | * Grow and shrink as desired
41 |
42 | ---
43 |
44 | ### Master Node
45 |
46 | * Maintains "official" cluster state and applies any modifications
47 | * Distributes shards in cluster
48 | * Does not necessarily have all the primary shards
49 | * Does not necessarily coordinate all the queries
50 |
51 | ---
52 |
53 | ### Zen
54 |
55 | * Elasticsearch built-in discovery algorithm
56 |
57 | ---
58 |
59 | ### Multicast Zen
60 |
61 | * Great for magically forming clusters
62 | * (Port 54328 broadcast to multicast group 224.2.2.4)
63 | * Doesn't work well in some cases
64 |
65 | ---
66 |
67 | ### Zen: Unicast
68 |
69 | * Specify list of IP addresses
70 |
71 | ---
72 |
73 | ### On AWS
74 |
75 | * Use AWS Discovery Plugin
76 | * Discover based on groups, IPs, tags
77 | * Bonus: save snapshots to S3
78 |
79 | ---
80 |
81 | ### Types of cluster communication
82 |
83 | ---
84 |
85 | ### Client nodes
86 |
87 | * Bidirectional R/W connection
88 | * Can be a data node
89 | * Port 9300
90 | * Full mesh
91 |
92 | ---
93 |
94 | ### Transport client
95 |
96 | * Unidirectional R/W connection
97 | * Does not join cluster
98 | * Port 9300
99 |
100 | ---
101 |
102 | ### Elasticsearch connections
103 |
104 | * **Recovery (2).** Index recovery
105 | * **Bulk (3).** Bulk operations
106 | * **Reg (6).** Normal queries
107 | * **State (1).** Cluster state read/write
108 | * **Ping (1).** - Detecting missing nodes
109 |
110 | ---
111 |
112 | ### REST client
113 |
114 | * HTTP
115 | * Port 9200
116 |
117 | ---
118 |
119 | ### Automatic shard balancing
120 |
121 | 
122 |
123 | ---
124 |
125 | ### Recovery
126 |
127 | * If master failed, elect a new master
128 | * If primary replica failed, make another replica primary
129 |
130 | ---
131 |
132 | ### Routing
133 | * **```shard = hash(id) % number_of_primary_shards```**
134 | * Customizable
135 |
136 | ---
137 |
138 | ### Servicing a search query
139 | 
140 |
141 | ---
142 |
143 | ### Split brain problem
144 | 
145 |
146 | ---
147 |
148 | ### Split brain safeguard
149 | * Have an odd number of master-eligible nodes
150 |
151 | ```
152 | discovery.zen.minimum_master_nodes: 2 #(n/2)+1
153 | ```
154 |
155 | ---
156 |
157 | ### Load problem
158 |
159 | * Master keeps getting overloaded and goes down
160 | * Other master-eligible nodes under heavy load too
161 | * Triggers a lot of instability
162 |
163 | ---
164 |
165 | ### Dedicated masters
166 |
167 | * Eligible masters and clients, but not data nodes
168 |
169 | ```
170 | node.master: true
171 | node.data: false
172 | ```
173 |
174 | ---
175 |
176 | ### Client-only data nodes
177 |
178 | ```
179 | node.master: false ## or node.client: true
180 | node.data: true
181 | ```
182 |
--------------------------------------------------------------------------------
/slides/slides/es-intro.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | "You know, for Search!"
4 |
5 | 
6 |
7 | ---
8 |
9 | 
10 |
11 | ---
12 |
13 | ## The Challenge
14 |
15 | 
16 |
17 | ---
18 |
19 | ### How We Query
20 |
21 | #### SQL Database
22 |
23 | ```sql
24 | SELECT *
25 | FROM Person INNER JOIN Scientist ON Person.ID = Scientist.ID
26 | WHERE FirstName LIKE "Edgar%" And LastName = "Codd";
27 | ```
28 |
29 | #### Elasticsearch
30 |
31 | ```json
32 | GET /spantree/_search
33 |
34 | {
35 | "query": {
36 | "query_string": {
37 | "query": "vannevar bush"
38 | }
39 | }
40 | }
41 | ```
42 |
43 | ---
44 |
45 | ### What People Expect
46 | #### Searching Across Fields
47 |
48 | ```json
49 | {
50 | "product": {
51 | "name": "nifty doodad",
52 | "description": "this is an example"
53 | }
54 | }
55 | ```
56 |
57 | This document should match example doodad
58 |
59 | ---
60 |
61 | ### What People Expect
62 |
63 |
64 |
65 | Filter
66 | Query
67 | Match
68 |
69 |
70 |
71 | Lowercase
72 | iPhone
73 |
74 | iphone
75 |
76 |
77 | Stemming
78 | Runner
79 |
80 | Running
81 |
82 |
83 | Synonyms
84 | Car
85 |
86 | Automobile
87 |
88 |
89 | Word delimiters
90 | Show-off
91 |
92 | Show off
93 |
94 |
95 | ASCII Folding
96 | Nestlé
97 |
98 | Nestle
99 |
100 |
101 | Pattern Replace
102 | +1 (888) 386-5501
103 |
104 | 8883865501
105 |
106 |
107 | Edge NGram
108 | ela
109 |
110 | elasticsearch
111 |
112 |
113 |
114 |
115 | ---
116 |
117 | ### Relational vs Non-Relational
118 |
119 | 
120 |
121 | ---
122 |
123 |
124 | ### Relational vs Document Model
125 |
126 | 
127 |
--------------------------------------------------------------------------------
/slides/slides/es-is-not.md:
--------------------------------------------------------------------------------
1 | ## Elasticsearch isn't...
2 |
3 | ---
4 |
5 | ### A Relational Database
6 |
7 | 
8 |
9 | ---
10 |
11 | ### Bulletproof
12 |
13 | 
14 |
15 | ---
16 |
17 | ### A Crawler
18 |
19 | 
20 |
21 | ---
22 |
23 | ### A Machine Learner
24 |
25 | 
26 | 
27 | 
28 |
29 |
30 | ---
31 |
32 | ### A User-Facing Search Experience
33 |
34 | 
35 |
36 | ---
37 |
38 | ### Secure
39 |
40 | 
41 |
--------------------------------------------------------------------------------
/slides/slides/es-is.md:
--------------------------------------------------------------------------------
1 | ## Elasticsearch is...
2 |
3 | ---
4 |
5 | ### Wicked Fast
6 |
7 | 
8 |
9 | ---
10 |
11 | ### Highly Configurable
12 |
13 | 
14 |
15 | ---
16 |
17 | ### Free and Open Source
18 |
19 | 
20 |
21 | ---
22 |
23 | ### Powered by Lucene
24 |
25 | 
26 |
27 | ---
28 |
29 | ### Distributed and Fault Tolerant
30 |
31 | 
32 |
33 | ---
34 |
35 | ### Good at Handling Lots of Data
36 |
37 | 
38 |
39 | ---
40 |
41 | ### ...Also Works With Unstructured Data
42 |
43 | 
44 |
45 | ---
46 |
47 | ### ...and Real-Time Analytics
48 |
49 | 
50 |
--------------------------------------------------------------------------------
/slides/slides/indexing.md:
--------------------------------------------------------------------------------
1 | ## Indexing
2 |
3 | ---
4 |
5 | ### Anatomy of a Request
6 |
7 | ```bash
8 | curl -XPUT 'http://localhost:9200/wikipedia/location/1' -d '{
9 | "name": "Spantree Technology Group, LLC",
10 | "about": "We build smart software for the web.",
11 | "lastUpdated": "2013-12-30T02:14:41+0000",
12 | "yearFounded": 2009
13 | }'
14 | ```
15 |
16 | [Basic Indexing](sense://indexing.sense)
17 |
18 | ---
19 |
20 | ### Automatic Mappings
21 |
22 | Elasticsearch will guess the mappings for new fields it hasn't seen before
23 |
24 | [Automatic Mappings in Action](sense://indexing.sense#L15)
25 |
26 | ---
27 |
28 | ### Update API
29 |
30 | You can also update a document via script or "upsert"
31 |
32 | [Update Examples](sense://indexing.sense#L31)
33 |
34 | ---
35 |
36 | ### Bulk API
37 |
38 | You can also add/remove/update documents in bulk using the Bulk API. This is recommended for batch updates
39 |
40 | [Bulk API Examples](sense://indexing.sense#L66)
41 |
42 | ---
43 |
44 | ### Consistency
45 |
46 | * Refresh intervals control how often newly indexed data is made available for search
47 | * New segments are created in the file system on each refresh
48 | * Smaller segments eventually merged with bigger ones
49 | * Segments are replicated between primaries and replicas
50 | * Queries can be run as sync (default), primary only or async
51 |
52 | ---
53 |
54 | ### Transaction Log
55 |
56 | * New insert/update/delete operations are written to a write-ahead log
57 | * In the event of segment corruption or node failure, the write-ahead log can be replayed
58 |
59 | ---
60 |
61 | ### Segments
62 |
63 | * Elasticsearch index consists of shards
64 | * Shard consists of Lucene index
65 | * Lucene index consists of segments
66 | * Segments consist of files
67 |
68 | ---
69 |
70 | ### Segment Hierarchy
71 |
72 | 
73 |
74 | ---
75 |
76 | ### Segment File Structure
77 |
78 | 
79 |
80 | [More Detail on Lucene Files](https://lucene.apache.org/core/3_0_3/fileformats.html#tis)
81 |
82 | ---
83 |
84 | ### Merging
85 |
86 | To avoid an infinitely growing number of tiny segments, smaller segment files merge with larger ones.
87 |
88 | 
89 |
90 | ---
91 |
92 | ### Merging in Motion
93 |
94 | 
95 |
96 | ---
97 |
98 | ### Tiered Merging in Motion
99 |
100 | 
101 |
102 | ---
103 |
104 | ### Indexing advice
105 |
106 | * Index asynchronously (via [CQRS](https://martinfowler.com/bliki/CQRS.html) if possible.
107 | * Have a separate process that batches updates into Elasticsearch.
108 | * Use the bulk API when possible.
109 | * Use updates when you can.
110 | * Be mindful of refresh intervals.
111 |
112 | ---
113 |
114 | ### Performance Tuning
115 |
116 | * More often than not, you are fine with only one shard.
117 | * Increase shards when you need more indexing throughput.
118 | * Increase replicas when you need more query throughput.
119 |
--------------------------------------------------------------------------------
/slides/slides/intro.md:
--------------------------------------------------------------------------------
1 | ### Hi friends!
2 |
3 | 
4 |
5 | ### is talking about
6 |
7 | 
8 |
9 | ---
10 |
11 | ### Who We Are
12 |
13 | 
14 |
15 | ---
16 |
17 | ### Who we work with
18 |
19 |
20 | 
21 | 
22 | 
23 | 
24 | 
25 | 
26 | 
27 | 
28 | 
29 | 
30 | 
31 | 
32 | 
33 | 
34 | 
35 | 
36 | 
37 | 
38 | 
39 | 
40 | 
41 |
42 |
43 | ---
44 |
45 | ### What We Use
46 |
47 |
48 |
49 | * **Cloud Platforms.** AWS, Google Cloud, Heroku.
50 | * **Systems Orchestration.** Docker, Kubernetes, Mesos, Terraform, Chef, Ansible.
51 | * **Continuous Delivery.** Jenkins, CircleCI, Spinnaker.
52 | * **Frontend Languages.** EcmaScript 6, Clojurescript, Coffeescript, Elm.
53 | * **Frontend Frameworks.** React, Angular, Backbone, Reframe.
54 | * **Backend Languages.** Java, Scala, Clojure, Groovy, Python, Kotlin, Go, Elixir.
55 | * **Backend Frameworks.** Spring Boot, Grails, Akka, Compojure, Phoenix.
56 | * **Testing Frameworks.** Spock, Geb, Gatling, Selenium.
57 | * **Databases.** PostgreSQL, Mongo, *Elasticsearch,* Neo4J, Dynamo, Redshift, Redis.
58 | * **Machine Learning.** Spark, Hadoop, Drools, Optaplanner.
59 |
60 | ---
61 |
62 | ### How this talk will work
63 |
64 | This tutorial is free and open source.
65 |
66 | http://github.com/Spantree/elasticsearch-talk
67 |
68 | We will jump out of the slide deck quite often.
69 |
--------------------------------------------------------------------------------
/slides/slides/list.json:
--------------------------------------------------------------------------------
1 | [
2 | "intro.md",
3 | "es-intro.md",
4 | "es-is.md",
5 | "es-is-not.md",
6 | "terminology.md",
7 | "tools.md",
8 | "indexing.md",
9 | "querying.md",
10 | "advanced-querying.md",
11 | "percolator.md",
12 | "mapping-and-analysis.md",
13 | "aggregations.md",
14 | "suggestions.md",
15 | "clustering.md",
16 | "security.md",
17 | "logging.md"
18 | ]
19 |
--------------------------------------------------------------------------------
/slides/slides/logging.md:
--------------------------------------------------------------------------------
1 | ## Log Aggregation with Elastic Stack
2 |
3 | * Elasticsearch
4 | * Logstash
5 | * Kibana
6 | * Beats
7 |
8 | ---
9 |
10 | ### What are our goals for log management?
11 |
12 | Aggregate business and system events from multiple sources
13 |
14 | Figure out what went wrong
15 |
16 | Figure out what will go wrong
17 |
18 | Search, filter and report via a central interface
19 |
20 | Detect critical events and trigger notifications
21 |
22 | Provide a low-maintenance toolchain
23 |
24 | ---
25 |
26 | ### How can we meet these goals?
27 |
28 | Use an agent to tail log files, parse them into a uniform format, and ship them "somewhere else."
29 |
30 |
31 | 
32 | 
33 | 
34 | 
35 | 
36 |
37 |
38 | ---
39 |
40 | ### How else can we meet these goals?
41 |
42 | Make that "somewhere else" be Elasticsearch, and use its powerful query and aggregation API to gain insights from events.
43 |
44 | 
45 |
46 | ---
47 |
48 | ### How else can we meet these goals?
49 |
50 | Develop a composable dashboard and data visualization tool to help us make sense of all this data.
51 |
52 | 
53 |
54 | ---
55 |
56 | ### What does this look like?
57 |
58 | 
59 |
60 | ---
61 |
62 | ### Beats in a Nutshell
63 |
64 | * Written in Golang
65 | * Designed to install at the edge of your logging events
66 | * Supports many different inputs and outputs
67 | * Supports limited enrichment
68 |
69 | ---
70 |
71 | ### Filebeat Config
72 |
73 | ```yaml
74 | filebeat.prospectors:
75 | - input_type: log
76 | paths:
77 | - /var/log/*.log
78 | output.elasticsearch:
79 | hosts: ["elastic1:9200"]
80 | ```
81 |
82 | ---
83 |
84 | ### Logstash in a Nutshell
85 |
86 | * JVM agent that runs in the background
87 | * Also supports many inputs
88 | * Uses a configuration format called `grok` to parse log files
89 | * Ships logging events in batch to an "output" (often Elasticsearch)
90 | * Not very fast (because JRuby)
91 |
92 | ---
93 |
94 | ### What does grok look like?
95 |
96 | ```
97 | input {
98 | file {
99 | path => "/var/log/http.log"
100 | }
101 | }
102 | filter {
103 | grok {
104 | type => "apache",
105 | match => [ "message", "\[%{HTTPDATE:timestamp}\] %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes}"]
106 | }
107 |
108 | date {
109 | type => "apache"
110 | match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
111 | }
112 | }
113 | output {
114 | elasticsearch {
115 | host => "elastic1"
116 | port => 9300
117 | }
118 | }
119 | ```
120 |
121 | ---
122 |
123 | ### What does the output look like?
124 |
125 | ```json
126 | {
127 | "_index": "logstash-2011.08.29",
128 | "_type": "apache",
129 | "_id": "3kHe3_YYRi6k7k4QrDcBcA",
130 | "_source": {
131 | "message": "[29/Aug/2011:13:19:31 -0700] 80.245.86.19 POST /blog/geekery/solaris-10-sshd-publickey-solution 16809",
132 | "@version": "1",
133 | "client": "80.245.86.19",
134 | "timestamp": "29/Aug/2011:13:19:31 -0700",
135 | "method": "POST",
136 | "request": "/blog/geekery/solaris-10-sshd-publickey-solution",
137 | "bytes": "16809"
138 | }
139 | }
140 | ```
141 |
142 | ---
143 |
144 | ### Elasticsearch 5.0
145 |
146 | * Coming Soon (or now)... [Ingest Nodes](https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest.html)
147 |
148 | ---
149 |
150 | ### Kibana
151 |
152 | [A picture is worth a thousand words](kibana://app/kibana)
153 |
--------------------------------------------------------------------------------
/slides/slides/mapping-and-analysis.md:
--------------------------------------------------------------------------------
1 | ## Mapping, Analysis and Embedded Objects
2 |
3 | ---
4 |
5 | ### Automatic Mappings
6 |
7 | * Elasticsearch will try to guess your mappings based on input
8 | * But you can also provide them explicitly
9 |
10 | [Mapping Exercises](sense://mapping-and-analysis.sense)
11 |
12 | ---
13 |
14 | ### Embedded Objects
15 |
16 | ---
17 |
18 | ## Inner object
19 |
20 | ```javascript
21 | [
22 | {
23 | first_name : "Gary",
24 | last_name : "Turovsky"
25 | },
26 | {
27 | first_name : "Cedric",
28 | last_name : "Hurst"
29 | }
30 | ]
31 | ```
32 |
33 | ### becomes
34 |
35 | ```javascript
36 | {
37 | first_name : ["Gary", "Cedric"],
38 | last_name : ["Turovsky", "Hurst"]
39 | }
40 | ```
41 |
42 | ---
43 |
44 | ## Nested
45 |
46 | * Maintained as separate document
47 | * Must be explicitly defined on mapping
48 | * Can only accessed by a nested query
49 | * Can use "include_in_root" to also index as inner object
50 | * Can complicate queries if there are multiple types of nested objects used
51 |
52 | ---
53 |
54 | ## Parent-child
55 |
56 | * Child is a first-class document that has a special `_parent` type
57 | * Can query on children separately from parents
58 | * Can do "Has Child/Parent" queries
59 | * Slower and require an in-memory *join table*
60 |
--------------------------------------------------------------------------------
/slides/slides/percolator.md:
--------------------------------------------------------------------------------
1 | ## It's Time for the Percolator
2 |
3 | 
4 |
5 | ---
6 |
7 | ### Querying, in Reverse
8 |
9 | * Typical flow is index documents -> Issue queries
10 | * Percolators let you index queries -> Issue documents
11 |
12 | ---
13 |
14 | ### Uses
15 |
16 | * Create feeds for clients / consumers
17 | * Trigger updates to other technology
18 |
19 | [API Example](sense://percolators.sense)
20 |
--------------------------------------------------------------------------------
/slides/slides/security.md:
--------------------------------------------------------------------------------
1 | ## Securing Elasticsearch
2 |
3 | ---
4 |
5 | ### By default, Elasticsearch trusts you
6 |
7 | * Out the box, systems that have access to port 9200 can basically do whatever they want
8 | * Do not allow direct access to port 9200
9 | * Elastic offers robust security through its [X-Pack](https://www.elastic.co/products/x-pack) (commericial support)
10 | * For simple authentication, there's also [Search Guard](https://floragunn.com/searchguard/)
11 |
12 | ---
13 |
14 | ### X-Pack Security
15 |
16 | * Protects data from unauthorized Users
17 |
18 | * Use built-in native authentication or integrate with other authentication systems (i.e. LDAP, Active Directory, build a custom realm)
19 |
20 | * Allows permissions to be defined through Users and Roles
21 | * Previously known as Shield
22 |
23 | ---
24 |
25 | ### X-Pack Security
26 |
27 | * Create a PUT/POST request to add a Role
28 |
29 | ```json
30 | POST /_xpack/security/role/my_admin_role
31 | {
32 | "cluster": ["all"],
33 | "indices": [
34 | {
35 | "names": [ "index1", "index2" ],
36 | "privileges": ["all"],
37 | "field_security" : { // optional
38 | "grant" : [ "title", "body" ]
39 | },
40 | "query": "{\"match\": {\"title\": \"foo\"}}" // optional
41 | }
42 | ],
43 | "run_as": [ "other_user" ], // optional
44 | "metadata" : { // optional
45 | "version" : 1
46 | }
47 | }
48 | ```
49 |
50 | ---
51 |
52 | ### X-Pack Security
53 |
54 | * Create a PUT/POST request to add a User
55 |
56 | ```json
57 | POST /_xpack/security/user/jacknich
58 | {
59 | "password" : "j@rV1s",
60 | "roles" : [ "admin", "other_role1" ],
61 | "full_name" : "Jack Nicholson",
62 | "email" : "jacknich@example.com",
63 | "metadata" : {
64 | "intelligence" : 7
65 | }
66 | }
67 | ```
68 |
69 | ---
70 |
71 | ### Scripting
72 |
73 | * Elasticsearch provides robust scripting support
74 | * Dynamic scripting is disabled by default in 2.x
75 | * [Remote code execution is possible](http://blog.liftsecurity.io/2013/11/30/elasticsearch-command-execution-using-script)
76 |
77 | ---
78 |
79 | ### Disabling dynamic scripts on older versions
80 |
81 | ```yaml
82 | script.disable_dynamic: false
83 | ```
84 |
85 | ---
86 |
87 | ### Use preloaded scripts instead
88 |
89 | ```bash
90 | $ cat config/scripts/scoring/recency_boost.groovy
91 | (0.08 / ((3.16*10.power(-11)) * (now - doc['timestamp'].date.getMillis()).abs() + 0.05)) + 1.0
92 | ```
93 |
94 | ```json
95 | {
96 | "script": "scoring_recency_boost",
97 | "params": {
98 | "now": 1386176910000
99 | }
100 | }
101 | ```
102 |
103 | ---
104 |
105 | ### Segregate different tenants/users into separate indexes
106 |
107 | * This allows you to create some high-level URL rules to eliminate cross-polination
108 | * Some apis like multi-search, multi-get and bulk allow take indexes as URL parameters or in the request body
109 | * Lock this down with `allow_explicit_index: false`
110 |
111 | ---
112 |
113 | ### Sample nginx proxy rules
114 |
115 | ```nginx
116 | server {
117 | listen *:80 ;
118 | server_name kibana.myhost.org;
119 |
120 | location / {
121 | root /var/www/myappregin;
122 | index index.html index.htm;
123 | }
124 |
125 | location ~ ^/(\S+)?_(aliases|nodes|search|mapping)$ {
126 | proxy_pass http://127.0.0.1:9200;
127 | proxy_read_timeout 90;
128 | }
129 | }
130 | ```
131 |
132 | ---
133 |
134 | ### Include ACLs in document body
135 |
136 | ```json
137 | {
138 | "title": "Elasticsearch in Action",
139 | "price": 34.99,
140 | "visible_to_groups": ["spantree", "strangeloop"],
141 | "visible_to_users": ["george_smith", "jane_jones"]
142 | }
143 | ```
144 |
145 | ---
146 |
147 | ### Use filter aliases to enforce ACLs
148 |
149 | ```json
150 | curl -XPOST 'http://localhost:9200/_aliases' -d '{
151 | "actions": [
152 | {
153 | "add": {
154 | "index": "books",
155 | "alias": "books_visible_to_group_spantree",
156 | "filter": {
157 | "term": { "visible_to_group": "spantree" }
158 | }
159 | }
160 | }
161 | ]
162 | }'
163 | ```
164 |
--------------------------------------------------------------------------------
/slides/slides/suggestions.md:
--------------------------------------------------------------------------------
1 | ## Suggestions
2 |
3 | ---
4 |
5 | ### Several types of suggestions
6 |
7 | ---
8 |
9 | ### Some definitions of suggestions
10 |
11 | * **Autocorrect** Pick closest known terms
12 | * **Autocomplete** Predict rest of query
13 | * **Autosuggest** Predict alternate queries
14 |
15 | ---
16 |
17 | ### Autocorrect
18 |
19 | * Term suggester
20 | * Phrase suggester
21 |
22 | ---
23 |
24 | ### Term suggester
25 |
26 | * Edit distance (Levenshtein)
27 |
28 | ---
29 |
30 | ### Term suggester
31 | [Term Suggester Examples](sense://suggestions.sense)
32 |
33 | ---
34 |
35 | ### Phrase suggester
36 |
37 | * How to correct multiple terms?
38 | * **Language model** for word likelihood
39 | * **Generators** to pick candidates
40 | * **Smoothing models** for scoring candidates
41 |
42 | ---
43 |
44 | ### Phrase suggester
45 | [Phrase API Examples](sense://suggestions.sense#L17)
46 |
47 | ---
48 |
49 | ### Autocomplete
50 |
51 | * Completion suggester
52 | * Context suggester
53 |
54 | ---
55 |
56 | ### Completion suggester
57 |
58 | * Manually add suggestions
59 | * If "input" then suggest "output"
60 | * Allows fuzzy queries
61 | * Suggestions can have payloads
62 |
63 | [Completion Suggester Examples](sense://suggestions.sense#L49)
64 |
65 | ---
66 |
67 | ### Context suggester
68 |
69 | * Define special completion field in mapping
70 | * Maintain completions by category or geolocation
71 |
72 | [Context Suggester Examples](sense://suggestions.sense#L127)
73 |
74 | ---
75 |
76 | ### Autosuggest
77 |
78 | * Data science tools -> Elasticsearch
79 |
80 | ---
81 |
82 | ### More like this
83 |
84 | [More Like This Example](sense://more-like-this.sense)
85 |
--------------------------------------------------------------------------------
/slides/slides/terminology.md:
--------------------------------------------------------------------------------
1 | ## Terminology
2 |
3 | ---
4 |
5 | ### Document
6 |
7 | * A record, unit of search
8 | * Represented as JSON
9 | * The thing returned in search results
10 | * Not quite a row, but similar
11 |
12 | ---
13 |
14 | ### What a document looks like
15 |
16 | ```json
17 |
18 | {
19 | "name": "Wells Community Academy High School",
20 | "wikipedia_numeric_id": 10907332,
21 | "keywords": ["schools", "chicago", "public"],
22 | "about": "Wells Community Academy High School is...",
23 | "lastUpdated": "2012-08-08T07:45:13+0000",
24 | "coordinates": [
25 | -87.667915,
26 | 41.899246
27 | ]
28 | }
29 | ```
30 |
31 | ---
32 |
33 | ### Data Types
34 |
35 |
36 |
37 | string
38 | long
39 | integer
40 |
41 |
42 | short
43 | byte
44 | double
45 |
46 |
47 | float
48 | date
49 | boolean
50 |
51 |
52 | binary
53 | type
54 | object
55 |
56 |
57 | nested
58 | geo_point
59 | geo_shape
60 |
61 |
62 | ip
63 | completion
64 |
65 |
66 |
67 | ---
68 |
69 | ### Field
70 |
71 | * A typed slot in a document for storing and retrieving values
72 | * Can store multiple values and nested values
73 | * Any field value for a document is optional
74 | * Not quite a column, but similar
75 |
76 | ---
77 |
78 | ### Types
79 |
80 | * Logical grouping of documents in an index
81 | * All documents in a given type have the same fields (but they're all optional)
82 |
83 | ---
84 |
85 | ### Tokens
86 |
87 | Individual words or pieces of text indexed by Elasticsearch, for example:
88 |
89 | `quick` `brown` `fox` `jumped` `over` `the` `lazy` `dog`
90 |
91 | ---
92 |
93 | ### Character filters
94 |
95 | * Preprocess a character stream before being passed to a tokenizer
96 | * Can only remove or replace single characters at a time
97 |
98 | ---
99 |
100 | ### Tokenizers
101 |
102 | Split phrases into words
103 |
104 | [Example](inquisitor://#/tokenizers)
105 |
106 | ---
107 |
108 | ### Token filters
109 |
110 | Modify tokens by adding, removing or changing their values
111 |
112 | [Example](inquisitor://#/analyzers)
113 |
114 | ---
115 |
116 | ### Analyzers
117 |
118 | A chain of character filters, tokenizers and token filters
119 |
120 | 
121 |
122 | ---
123 |
124 | ### Index
125 |
126 | * A collection of documents managed as a unit
127 | * Physically isolated in separate files on disk (segments)
128 | * Similar to a database, but not quite
129 | * Elasticsearch allows you to search across indices
130 |
131 | ---
132 |
133 | ### Node
134 |
135 | * An running instance of Elasticsearch
136 | * Can be master, client or data node (or any combination)
137 |
138 | ---
139 |
140 | ### Cluster
141 |
142 | One or more nodes sharing data and workload
143 |
144 | ---
145 |
146 | ### Shard
147 |
148 | * A slice of the data in an index
149 | * Siloed in different directories
150 | * Can be replicated across nodes
151 |
152 | ---
153 |
154 | ### A physical view
155 |
156 | 
157 |
--------------------------------------------------------------------------------
/slides/slides/tools.md:
--------------------------------------------------------------------------------
1 | ## What's in the Box?
2 |
3 | ---
4 |
5 | ### Preseeded Elasticsearch Indices
6 |
7 | * **Freebase Film Index** - Detailed list of 137K films from freebase.com
8 | * **Divvy Rides & Stations** - Rides and station information from Divvy 2013 data challenge
9 | * **Wikipedia Points of Interest** - Small sample of Chicago points of interest from Wikipedia
10 | * Kibana / Marvel data
11 |
12 | ---
13 |
14 | ### Kopf
15 |
16 | * A simple web administration tool written in AngularJS.
17 | * [Kopf](elasticsearch://_plugin/kopf/)
18 |
19 | ---
20 |
21 | ### Sense
22 |
23 | * An IDE (with autocomplete) for running Elasticsearch queries against the REST API.
24 |
25 | [Sense](sense://)
26 |
27 | ---
28 |
29 | ### More
30 |
31 | * [Inquisitor](inquisitor://#/analyzers) - Explore how Elasticsearch processes strings
32 | * [Marvel](kibana://app/marvel) - Monitor the health of your cluster
33 | * [Kibana](kibana://app/kibana) - Visualize your logs
34 |
35 | ---
36 |
37 | ### API Examples
38 |
39 | * Executed with Sense
40 | * [Get Started with Sense](sense://getting-started.sense#L2)
41 |
--------------------------------------------------------------------------------
/slides/templates/_section.html:
--------------------------------------------------------------------------------
1 | <% if (!_.isString(slide) && !_.isArray(slide) && _.isObject(slide)) { %>
2 | <% if (_.isString(slide.filename)) { %>data-<% if (slide.filename.indexOf('.html') !== -1) { %>html<% } else { %>markdown<% }%>="slides/<%= slide.filename %>"<% } %>>
3 | <% } %><% if (_.isString(slide)) { %>
4 | html<% } else { %>markdown<% }%>="slides/<%= slide %>">
9 | <% } %>
10 |
--------------------------------------------------------------------------------
/snapshot-manifest:
--------------------------------------------------------------------------------
1 | wikipedia-2017-01-30-14-08-44
2 | divvy-2017-01-29-21-22-26
3 | freebase-2017-01-30-13-57-47
4 |
--------------------------------------------------------------------------------
/www/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx:latest
2 |
3 | MAINTAINER Spantree Technology Group
4 |
5 | ENV LANG C.UTF-8
6 | ENV REVEAL_VERSION 2.6.2
7 | ENV MATHJAX_VERSION 2.5.3
8 |
9 | ENV CA_CERTIFICATES_JAVA_VERSION 20140324
10 |
11 | RUN apt-get update \
12 | && apt-get install -y -q wget nodejs npm nodejs-legacy openjdk-7-jdk ca-certificates-java="$CA_CERTIFICATES_JAVA_VERSION" \
13 | && rm -rf /var/lib/apt/lists/*
14 |
15 | RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure
16 |
17 | WORKDIR /tmp/revealjs
18 |
19 | RUN wget -q https://github.com/hakimel/reveal.js/archive/$REVEAL_VERSION.tar.gz \
20 | && tar xzf $REVEAL_VERSION.tar.gz \
21 | && rm $REVEAL_VERSION.tar.gz \
22 | && mv reveal.js-$REVEAL_VERSION /usr/share/nginx/html/slides
23 |
24 | ADD nginx/default.conf /etc/nginx/conf.d/default.conf
25 |
26 | ADD transform /usr/local/src/transform
27 | ADD examples /usr/local/src/examples
28 |
29 | WORKDIR /usr/local/src/transform
30 | RUN /usr/local/src/transform/gradlew transform -Parguments="-e /usr/local/src/examples -o /usr/share/nginx/html"
31 |
32 | WORKDIR /tmp/mathjax
33 |
34 | RUN wget -q http://github.com/mathjax/MathJax/archive/$MATHJAX_VERSION.tar.gz \
35 | && tar xzf $MATHJAX_VERSION.tar.gz \
36 | && rm $MATHJAX_VERSION.tar.gz \
37 | && mv MathJax-$MATHJAX_VERSION /usr/local/src/
38 |
39 | WORKDIR /usr/share/nginx/html/slides
40 |
41 | RUN npm install -g grunt-cli \
42 | && npm install \
43 | && sed -i Gruntfile.js -e 's/port: port,/port: port, hostname: "",/'
44 |
45 | ADD slides/js/ /usr/share/nginx/html/slides/js
46 | RUN ln -sf /usr/local/src/MathJax-$MATHJAX_VERSION /usr/share/nginx/html/slides/js/MathJax
47 |
48 | ADD slides/index.html /usr/share/nginx/html/slides/index.html
49 | ADD slides/css/ /usr/share/nginx/html/slides/css
50 | ADD slides/custom_css/ /usr/share/nginx/html/slides/custom_css
51 | ADD slides/images/ /usr/share/nginx/html/slides/images
52 | ADD slides/lib/ /usr/share/nginx/html/slides/lib
53 | ADD slides/plugin/ /usr/share/nginx/html/slides/plugin
54 | ADD slides/sections/ /usr/share/nginx/html/slides/sections
--------------------------------------------------------------------------------
/www/nginx/default.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | server_name localhost;
4 |
5 | #charset koi8-r;
6 | #access_log /var/log/nginx/log/host.access.log main;
7 |
8 | location / {
9 | root /usr/share/nginx/html;
10 | index index.html index.htm;
11 | add_header Access-Control-Allow-Origin *;
12 | }
13 |
14 | #error_page 404 /404.html;
15 |
16 | # redirect server error pages to the static page /50x.html
17 | #
18 | error_page 500 502 503 504 /50x.html;
19 | location = /50x.html {
20 | root /usr/share/nginx/html;
21 | }
22 |
23 | # proxy the PHP scripts to Apache listening on 127.0.0.1:80
24 | #
25 | #location ~ \.php$ {
26 | # proxy_pass http://127.0.0.1;
27 | #}
28 |
29 | # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
30 | #
31 | #location ~ \.php$ {
32 | # root html;
33 | # fastcgi_pass 127.0.0.1:9000;
34 | # fastcgi_index index.php;
35 | # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
36 | # include fastcgi_params;
37 | #}
38 |
39 | # deny access to .htaccess files, if Apache's document root
40 | # concurs with nginx's one
41 | #
42 | #location ~ /\.ht {
43 | # deny all;
44 | #}
45 | }
--------------------------------------------------------------------------------
/www/slides/css/theme/README.md:
--------------------------------------------------------------------------------
1 | ## Dependencies
2 |
3 | Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup
4 |
5 | You also need to install Ruby and then Sass (with `gem install sass`).
6 |
7 | ## Creating a Theme
8 |
9 | To create your own theme, start by duplicating any ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source) and adding it to the compilation list in the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js).
10 |
11 | Each theme file does four things in the following order:
12 |
13 | 1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**
14 | Shared utility functions.
15 |
16 | 2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**
17 | Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3.
18 |
19 | 3. **Override**
20 | This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding full selectors with hardcoded styles.
21 |
22 | 4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**
23 | The template theme file which will generate final CSS output based on the currently defined variables.
24 |
25 | When you are done, run `grunt themes` to compile the Sass file to CSS and you are ready to use your new theme.
26 |
--------------------------------------------------------------------------------
/www/slides/css/theme/source/beige.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Beige theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @font-face {
17 | font-family: 'League Gothic';
18 | src: url('../../lib/font/league_gothic-webfont.eot');
19 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
20 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
21 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
22 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
23 |
24 | font-weight: normal;
25 | font-style: normal;
26 | }
27 |
28 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
29 |
30 |
31 | // Override theme settings (see ../template/settings.scss)
32 | $mainColor: #333;
33 | $headingColor: #333;
34 | $headingTextShadow: none;
35 | $backgroundColor: #f7f3de;
36 | $linkColor: #8b743d;
37 | $linkColorHover: lighten( $linkColor, 20% );
38 | $selectionBackgroundColor: rgba(79, 64, 28, 0.99);
39 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
40 |
41 | // Background generator
42 | @mixin bodyBackground() {
43 | @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) );
44 | }
45 |
46 |
47 |
48 | // Theme template ------------------------------
49 | @import "../template/theme";
50 | // ---------------------------------------------
--------------------------------------------------------------------------------
/www/slides/css/theme/source/blood.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Blood theme for reveal.js
3 | * Author: Walther http://github.com/Walther
4 | *
5 | * Designed to be used with highlight.js theme
6 | * "monokai_sublime.css" available from
7 | * https://github.com/isagalaev/highlight.js/
8 | *
9 | * For other themes, change $codeBackground accordingly.
10 | *
11 | */
12 |
13 | // Default mixins and settings -----------------
14 | @import "../template/mixins";
15 | @import "../template/settings";
16 | // ---------------------------------------------
17 |
18 | // Include theme-specific fonts
19 |
20 | @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
21 |
22 | // Colors used in the theme
23 | $blood: #a23;
24 | $coal: #222;
25 | $codeBackground: #23241f;
26 |
27 | // Main text
28 | $mainFont: Ubuntu, 'sans-serif';
29 | $mainFontSize: 36px;
30 | $mainColor: #eee;
31 |
32 | // Headings
33 | $headingFont: Ubuntu, 'sans-serif';
34 | $headingTextShadow: 2px 2px 2px $coal;
35 |
36 | // h1 shadow, borrowed humbly from
37 | // (c) Default theme by Hakim El Hattab
38 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
39 |
40 | // Links
41 | $linkColor: $blood;
42 | $linkColorHover: lighten( $linkColor, 20% );
43 |
44 | // Text selection
45 | $selectionBackgroundColor: $blood;
46 | $selectionColor: #fff;
47 |
48 | // Background generator
49 | @mixin bodyBackground() {
50 | @include radial-gradient( $coal, lighten( $coal, 25% ) );
51 | }
52 |
53 | // Theme template ------------------------------
54 | @import "../template/theme";
55 | // ---------------------------------------------
56 |
57 | // some overrides after theme template import
58 |
59 | .reveal p {
60 | font-weight: 300;
61 | text-shadow: 1px 1px $coal;
62 | }
63 |
64 | .reveal h1,
65 | .reveal h2,
66 | .reveal h3,
67 | .reveal h4,
68 | .reveal h5,
69 | .reveal h6 {
70 | font-weight: 700;
71 | }
72 |
73 | .reveal a:not(.image),
74 | .reveal a:not(.image):hover {
75 | text-shadow: 2px 2px 2px #000;
76 | }
77 |
78 | .reveal small a:not(.image),
79 | .reveal small a:not(.image):hover {
80 | text-shadow: 1px 1px 1px #000;
81 | }
82 |
83 | .reveal p code {
84 | background-color: $codeBackground;
85 | display: inline-block;
86 | border-radius: 7px;
87 | }
88 |
89 | .reveal small code {
90 | vertical-align: baseline;
91 | }
--------------------------------------------------------------------------------
/www/slides/css/theme/source/default.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Default theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @font-face {
17 | font-family: 'League Gothic';
18 | src: url('../../lib/font/league_gothic-webfont.eot');
19 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
20 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
21 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
22 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
23 |
24 | font-weight: normal;
25 | font-style: normal;
26 | }
27 |
28 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
29 |
30 | // Override theme settings (see ../template/settings.scss)
31 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
32 |
33 | // Background generator
34 | @mixin bodyBackground() {
35 | @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) );
36 | }
37 |
38 |
39 |
40 | // Theme template ------------------------------
41 | @import "../template/theme";
42 | // ---------------------------------------------
--------------------------------------------------------------------------------
/www/slides/css/theme/source/moon.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Dark theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 | /**
30 | * Solarized colors by Ethan Schoonover
31 | */
32 | html * {
33 | color-profile: sRGB;
34 | rendering-intent: auto;
35 | }
36 |
37 | // Solarized colors
38 | $base03: #002b36;
39 | $base02: #073642;
40 | $base01: #586e75;
41 | $base00: #657b83;
42 | $base0: #839496;
43 | $base1: #93a1a1;
44 | $base2: #eee8d5;
45 | $base3: #fdf6e3;
46 | $yellow: #b58900;
47 | $orange: #cb4b16;
48 | $red: #dc322f;
49 | $magenta: #d33682;
50 | $violet: #6c71c4;
51 | $blue: #268bd2;
52 | $cyan: #2aa198;
53 | $green: #859900;
54 |
55 | // Override theme settings (see ../template/settings.scss)
56 | $mainColor: $base1;
57 | $headingColor: $base2;
58 | $headingTextShadow: none;
59 | $backgroundColor: $base03;
60 | $linkColor: $blue;
61 | $linkColorHover: lighten( $linkColor, 20% );
62 | $selectionBackgroundColor: $magenta;
63 |
64 |
65 |
66 | // Theme template ------------------------------
67 | @import "../template/theme";
68 | // ---------------------------------------------
69 |
--------------------------------------------------------------------------------
/www/slides/css/theme/source/night.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Black theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700);
16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
17 |
18 |
19 | // Override theme settings (see ../template/settings.scss)
20 | $backgroundColor: #111;
21 |
22 | $mainFont: 'Open Sans', sans-serif;
23 | $linkColor: #e7ad52;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 | $headingFont: 'Montserrat', Impact, sans-serif;
26 | $headingTextShadow: none;
27 | $headingLetterSpacing: -0.03em;
28 | $headingTextTransform: none;
29 | $selectionBackgroundColor: #e7ad52;
30 | $mainFontSize: 30px;
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
--------------------------------------------------------------------------------
/www/slides/css/theme/source/serif.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is brown.
4 | *
5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
6 | */
7 |
8 |
9 | // Default mixins and settings -----------------
10 | @import "../template/mixins";
11 | @import "../template/settings";
12 | // ---------------------------------------------
13 |
14 |
15 |
16 | // Override theme settings (see ../template/settings.scss)
17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
18 | $mainColor: #000;
19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
20 | $headingColor: #383D3D;
21 | $headingTextShadow: none;
22 | $headingTextTransform: none;
23 | $backgroundColor: #F0F1EB;
24 | $linkColor: #51483D;
25 | $linkColorHover: lighten( $linkColor, 20% );
26 | $selectionBackgroundColor: #26351C;
27 |
28 | .reveal a:not(.image) {
29 | line-height: 1.3em;
30 | }
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
36 |
--------------------------------------------------------------------------------
/www/slides/css/theme/source/simple.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is darkblue.
4 | *
5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
7 | */
8 |
9 |
10 | // Default mixins and settings -----------------
11 | @import "../template/mixins";
12 | @import "../template/settings";
13 | // ---------------------------------------------
14 |
15 |
16 |
17 | // Include theme-specific fonts
18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
20 |
21 |
22 | // Override theme settings (see ../template/settings.scss)
23 | $mainFont: 'Lato', sans-serif;
24 | $mainColor: #000;
25 | $headingFont: 'News Cycle', Impact, sans-serif;
26 | $headingColor: #000;
27 | $headingTextShadow: none;
28 | $headingTextTransform: none;
29 | $backgroundColor: #fff;
30 | $linkColor: #00008B;
31 | $linkColorHover: lighten( $linkColor, 20% );
32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99);
33 |
34 |
35 |
36 | // Theme template ------------------------------
37 | @import "../template/theme";
38 | // ---------------------------------------------
--------------------------------------------------------------------------------
/www/slides/css/theme/source/sky.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Sky theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
18 |
19 |
20 | // Override theme settings (see ../template/settings.scss)
21 | $mainFont: 'Open Sans', sans-serif;
22 | $mainColor: #333;
23 | $headingFont: 'Quicksand', sans-serif;
24 | $headingColor: #333;
25 | $headingLetterSpacing: -0.08em;
26 | $headingTextShadow: none;
27 | $backgroundColor: #f7fbfc;
28 | $linkColor: #3b759e;
29 | $linkColorHover: lighten( $linkColor, 20% );
30 | $selectionBackgroundColor: #134674;
31 |
32 | // Fix links so they are not cut off
33 | .reveal a:not(.image) {
34 | line-height: 1.3em;
35 | }
36 |
37 | // Background generator
38 | @mixin bodyBackground() {
39 | @include radial-gradient( #add9e4, #f7fbfc );
40 | }
41 |
42 |
43 |
44 | // Theme template ------------------------------
45 | @import "../template/theme";
46 | // ---------------------------------------------
47 |
--------------------------------------------------------------------------------
/www/slides/css/theme/source/solarized.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Light theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 |
30 | /**
31 | * Solarized colors by Ethan Schoonover
32 | */
33 | html * {
34 | color-profile: sRGB;
35 | rendering-intent: auto;
36 | }
37 |
38 | // Solarized colors
39 | $base03: #002b36;
40 | $base02: #073642;
41 | $base01: #586e75;
42 | $base00: #657b83;
43 | $base0: #839496;
44 | $base1: #93a1a1;
45 | $base2: #eee8d5;
46 | $base3: #fdf6e3;
47 | $yellow: #b58900;
48 | $orange: #cb4b16;
49 | $red: #dc322f;
50 | $magenta: #d33682;
51 | $violet: #6c71c4;
52 | $blue: #268bd2;
53 | $cyan: #2aa198;
54 | $green: #859900;
55 |
56 | // Override theme settings (see ../template/settings.scss)
57 | $mainColor: $base00;
58 | $headingColor: $base01;
59 | $headingTextShadow: none;
60 | $backgroundColor: $base3;
61 | $linkColor: $blue;
62 | $linkColorHover: lighten( $linkColor, 20% );
63 | $selectionBackgroundColor: $magenta;
64 |
65 | // Background generator
66 | // @mixin bodyBackground() {
67 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
68 | // }
69 |
70 |
71 |
72 | // Theme template ------------------------------
73 | @import "../template/theme";
74 | // ---------------------------------------------
75 |
--------------------------------------------------------------------------------
/www/slides/css/theme/template/mixins.scss:
--------------------------------------------------------------------------------
1 | @mixin vertical-gradient( $top, $bottom ) {
2 | background: $top;
3 | background: -moz-linear-gradient( top, $top 0%, $bottom 100% );
4 | background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) );
5 | background: -webkit-linear-gradient( top, $top 0%, $bottom 100% );
6 | background: -o-linear-gradient( top, $top 0%, $bottom 100% );
7 | background: -ms-linear-gradient( top, $top 0%, $bottom 100% );
8 | background: linear-gradient( top, $top 0%, $bottom 100% );
9 | }
10 |
11 | @mixin horizontal-gradient( $top, $bottom ) {
12 | background: $top;
13 | background: -moz-linear-gradient( left, $top 0%, $bottom 100% );
14 | background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) );
15 | background: -webkit-linear-gradient( left, $top 0%, $bottom 100% );
16 | background: -o-linear-gradient( left, $top 0%, $bottom 100% );
17 | background: -ms-linear-gradient( left, $top 0%, $bottom 100% );
18 | background: linear-gradient( left, $top 0%, $bottom 100% );
19 | }
20 |
21 | @mixin radial-gradient( $outer, $inner, $type: circle ) {
22 | background: $outer;
23 | background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
24 | background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) );
25 | background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
26 | background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
27 | background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
28 | background: radial-gradient( center, $type cover, $inner 0%, $outer 100% );
29 | }
--------------------------------------------------------------------------------
/www/slides/css/theme/template/settings.scss:
--------------------------------------------------------------------------------
1 | // Base settings for all themes that can optionally be
2 | // overridden by the super-theme
3 |
4 | // Background of the presentation
5 | $backgroundColor: #2b2b2b;
6 |
7 | // Primary/body text
8 | $mainFont: 'Lato', sans-serif;
9 | $mainFontSize: 36px;
10 | $mainColor: #eee;
11 |
12 | // Headings
13 | $headingMargin: 0 0 20px 0;
14 | $headingFont: 'League Gothic', Impact, sans-serif;
15 | $headingColor: #eee;
16 | $headingLineHeight: 0.9em;
17 | $headingLetterSpacing: 0.02em;
18 | $headingTextTransform: uppercase;
19 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
20 | $heading1TextShadow: $headingTextShadow;
21 |
22 | // Links and actions
23 | $linkColor: #13DAEC;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 |
26 | // Text selection
27 | $selectionBackgroundColor: #FF5E99;
28 | $selectionColor: #fff;
29 |
30 | // Generates the presentation background, can be overridden
31 | // to return a background image or gradient
32 | @mixin bodyBackground() {
33 | background: $backgroundColor;
34 | }
--------------------------------------------------------------------------------
/www/slides/custom_css/spantree.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #61ae24 100%);
3 | font-family: "Helvetica Neue";
4 | }
5 |
6 | .reveal section {
7 |
8 | }
9 |
10 | .reveal pre {
11 | border: 15px solid rgba(63, 63, 63, 1);
12 | margin-bottom: 30px;
13 | }
14 |
15 | .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {
16 | margin-bottom: 30px;
17 | font-family: "Helvetica Neue";
18 | letter-spacing: normal;
19 | }
20 |
21 | .reveal h3, .reveal h4, .reveal h5, .reveal h6 {
22 | text-transform: none;
23 | }
24 | .reveal section img {
25 | max-width: 90%;
26 | border: 0px solid black;
27 | box-shadow: none;
28 | background: none;
29 | }
30 |
31 | section.logos img {
32 | max-width: 220px;
33 | max-height: 70px;
34 | margin: 0px 10px;
35 | }
36 |
37 | section.logos-big img {
38 | max-width: 440px;
39 | max-height: 300px;
40 | margin: 0px 10px;
41 | }
42 |
43 | #title img {
44 | max-width: 600px;
45 | margin-bottom: 25px;
46 | /* margin: 0px 10px;*/
47 | }
48 |
49 | .reveal section.screenshot p img,
50 | .reveal section.screenshot iframe {
51 | max-height: 550px;
52 | border: 10px solid rgba(255, 255, 255, 0.8);
53 | }
54 |
55 | .reveal section.screenshot-dark p img {
56 | max-height: 550px;
57 | border: 10px solid rgba(60, 60, 60, 0.8);
58 | }
59 |
60 | table.examples {
61 | text-align: center;
62 | width: 100%;
63 | }
64 |
65 | table.examples td, table.examples th {
66 | padding: 5px 10px;
67 | }
68 |
69 | table.examples th {
70 | text-wrap: suppress;
71 | }
72 |
73 | table.documents {
74 | width: 100%;
75 | border-collapse: collapse;
76 | font-family: "Helvetica Neue";
77 | /*border: 1px solid #333;*/
78 | }
79 |
80 | table.documents th, table.documents td {
81 | background-color: #fff;
82 | font-size: 0.5em;
83 | padding: 30px;
84 | text-align: center;
85 | margin: 0px;
86 | line-height: 1.5;
87 | }
88 |
89 | table.documents th {
90 | border-left: 1px solid #000;
91 | border-right: 1px solid #000;
92 | border-top: 1px solid #000;
93 | border-bottom: none;
94 | margin-right: 10px;
95 | padding-bottom: 0px;
96 | }
97 |
98 | table.documents td {
99 | padding-top: 0px;
100 | border-left: 1px solid #000;
101 | border-right: 1px solid #000;
102 | border-top: none;
103 | border-bottom: 1px solid #000;
104 | }
105 |
106 | table.laundry-list td {
107 | padding-right: 40px;
108 | }
109 |
110 | table.tf-idf {
111 | margin: auto;
112 | }
113 |
114 | table.tf-idf td {
115 | padding-right: 40px;
116 | }
117 |
118 | table.scoring{
119 | margin: auto;
120 | }
121 |
122 | table.scoring td {
123 | padding-right: 40px
124 | }
125 |
126 | table.qvf{
127 | margin: auto;
128 | }
129 |
130 | table.qvf td {
131 | padding-right: 40px
132 | }
133 |
134 | section.logos img {
135 | max-width: 150px;
136 | max-height: 70px;
137 | margin: 0px 10px;
138 | padding: 10px;
139 | }
140 |
141 | table.ourpictures {
142 | margin: auto;
143 | }
144 |
145 | table.ourpictures img {
146 | max-height: 120px;
147 | }
148 |
149 | table.ourpictures td {
150 | width: 200px;
151 | font-size: 14pt;
152 | line-height: 20pt;
153 | }
154 |
155 | table.ourpictures td img {
156 | height: 220px;
157 | }
158 |
159 | table.examples {
160 | width: 100%;
161 | }
162 |
163 | table.examples td {
164 | text-align: center;
165 | }
166 |
167 | table.col-3 td {
168 | width: 33.33%;
169 | }
170 |
171 | .reveal ul {
172 | margin-top: 1em;
173 | list-style-type: none;
174 | }
175 |
176 | .reveal ul li {
177 | margin-bottom: 0.5em;
178 | text-align: center;
179 | }
--------------------------------------------------------------------------------
/www/slides/custom_css/sublime_monokai.css:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
4 |
5 | */
6 |
7 | .hljs {
8 | display: block;
9 | padding: 0.5em;
10 | background: #23241f;
11 | }
12 |
13 | .hljs,
14 | .hljs-tag,
15 | .css .hljs-rules,
16 | .css .hljs-value,
17 | .css .hljs-function
18 | .hljs-preprocessor,
19 | .hljs-pragma {
20 | color: #f8f8f2;
21 | }
22 |
23 | .hljs-strongemphasis,
24 | .hljs-strong,
25 | .hljs-emphasis {
26 | color: #a8a8a2;
27 | }
28 |
29 | .hljs-bullet,
30 | .hljs-blockquote,
31 | .hljs-horizontal_rule,
32 | .hljs-number,
33 | .hljs-regexp,
34 | .alias .hljs-keyword,
35 | .hljs-literal,
36 | .hljs-hexcolor {
37 | color: #ae81ff;
38 | }
39 |
40 | .hljs-tag .hljs-value,
41 | .hljs-code,
42 | .hljs-title,
43 | .css .hljs-class,
44 | .hljs-class .hljs-title:last-child {
45 | color: #a6e22e;
46 | }
47 |
48 | .hljs-link_url {
49 | font-size: 80%;
50 | }
51 |
52 | .hljs-strong,
53 | .hljs-strongemphasis {
54 | font-weight: bold;
55 | }
56 |
57 | .hljs-emphasis,
58 | .hljs-strongemphasis,
59 | .hljs-class .hljs-title:last-child {
60 | font-style: italic;
61 | }
62 |
63 | .hljs-keyword,
64 | .hljs-function,
65 | .hljs-change,
66 | .hljs-winutils,
67 | .hljs-flow,
68 | .lisp .hljs-title,
69 | .clojure .hljs-built_in,
70 | .nginx .hljs-title,
71 | .tex .hljs-special,
72 | .hljs-header,
73 | .hljs-attribute,
74 | .hljs-symbol,
75 | .hljs-symbol .hljs-string,
76 | .hljs-tag .hljs-title,
77 | .hljs-value,
78 | .alias .hljs-keyword:first-child,
79 | .css .hljs-tag,
80 | .css .unit,
81 | .css .hljs-important {
82 | color: #F92672;
83 | }
84 |
85 | .hljs-function .hljs-keyword,
86 | .hljs-class .hljs-keyword:first-child,
87 | .hljs-constant,
88 | .css .hljs-attribute {
89 | color: #66d9ef;
90 | }
91 |
92 | .hljs-variable,
93 | .hljs-params,
94 | .hljs-class .hljs-title {
95 | color: #f8f8f2;
96 | }
97 |
98 | .hljs-string,
99 | .css .hljs-id,
100 | .hljs-subst,
101 | .haskell .hljs-type,
102 | .ruby .hljs-class .hljs-parent,
103 | .hljs-built_in,
104 | .django .hljs-template_tag,
105 | .django .hljs-variable,
106 | .smalltalk .hljs-class,
107 | .django .hljs-filter .hljs-argument,
108 | .smalltalk .hljs-localvars,
109 | .smalltalk .hljs-array,
110 | .hljs-attr_selector,
111 | .hljs-pseudo,
112 | .hljs-addition,
113 | .hljs-stream,
114 | .hljs-envvar,
115 | .apache .hljs-tag,
116 | .apache .hljs-cbracket,
117 | .tex .hljs-command,
118 | .hljs-prompt,
119 | .hljs-link_label,
120 | .hljs-link_url {
121 | color: #e6db74;
122 | }
123 |
124 | .hljs-comment,
125 | .hljs-javadoc,
126 | .java .hljs-annotation,
127 | .python .hljs-decorator,
128 | .hljs-template_comment,
129 | .hljs-pi,
130 | .hljs-doctype,
131 | .hljs-deletion,
132 | .hljs-shebang,
133 | .apache .hljs-sqbracket,
134 | .tex .hljs-formula {
135 | color: #75715e;
136 | }
137 |
138 | .coffeescript .javascript,
139 | .javascript .xml,
140 | .tex .hljs-formula,
141 | .xml .javascript,
142 | .xml .vbscript,
143 | .xml .css,
144 | .xml .hljs-cdata,
145 | .xml .php,
146 | .php .xml {
147 | opacity: 0.5;
148 | }
--------------------------------------------------------------------------------
/www/slides/lib/css/tomorrow-night-bright.css:
--------------------------------------------------------------------------------
1 | /* Tomorrow Night Bright Theme */
2 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */
3 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
4 | .tomorrow-comment, pre .comment, pre .title {
5 | color: #969896;
6 | }
7 |
8 | .tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
9 | color: #d54e53;
10 | }
11 |
12 | .tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant {
13 | color: #e78c45;
14 | }
15 |
16 | .tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute {
17 | color: #e7c547;
18 | }
19 |
20 | .tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
21 | color: #b9ca4a;
22 | }
23 |
24 | .tomorrow-aqua, pre .css .hexcolor {
25 | color: #70c0b1;
26 | }
27 |
28 | .tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
29 | color: #7aa6da;
30 | }
31 |
32 | .tomorrow-purple, pre .keyword, pre .javascript .function {
33 | color: #c397d8;
34 | }
35 |
36 | pre code {
37 | display: block;
38 | background: black;
39 | color: #eaeaea;
40 | font-family: Menlo, Monaco, Consolas, monospace;
41 | line-height: 1.5;
42 | border: 1px solid #ccc;
43 | padding: 10px;
44 | }
45 |
--------------------------------------------------------------------------------
/www/slides/lib/css/zenburn.css:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov
4 | based on dark.css by Ivan Sagalaev
5 |
6 | */
7 |
8 | pre code {
9 | display: block; padding: 0.5em;
10 | background: #3F3F3F;
11 | color: #DCDCDC;
12 | }
13 |
14 | pre .keyword,
15 | pre .tag,
16 | pre .css .class,
17 | pre .css .id,
18 | pre .lisp .title,
19 | pre .nginx .title,
20 | pre .request,
21 | pre .status,
22 | pre .clojure .attribute {
23 | color: #E3CEAB;
24 | }
25 |
26 | pre .django .template_tag,
27 | pre .django .variable,
28 | pre .django .filter .argument {
29 | color: #DCDCDC;
30 | }
31 |
32 | pre .number,
33 | pre .date {
34 | color: #8CD0D3;
35 | }
36 |
37 | pre .dos .envvar,
38 | pre .dos .stream,
39 | pre .variable,
40 | pre .apache .sqbracket {
41 | color: #EFDCBC;
42 | }
43 |
44 | pre .dos .flow,
45 | pre .diff .change,
46 | pre .python .exception,
47 | pre .python .built_in,
48 | pre .literal,
49 | pre .tex .special {
50 | color: #EFEFAF;
51 | }
52 |
53 | pre .diff .chunk,
54 | pre .subst {
55 | color: #8F8F8F;
56 | }
57 |
58 | pre .dos .keyword,
59 | pre .python .decorator,
60 | pre .title,
61 | pre .haskell .type,
62 | pre .diff .header,
63 | pre .ruby .class .parent,
64 | pre .apache .tag,
65 | pre .nginx .built_in,
66 | pre .tex .command,
67 | pre .prompt {
68 | color: #efef8f;
69 | }
70 |
71 | pre .dos .winutils,
72 | pre .ruby .symbol,
73 | pre .ruby .symbol .string,
74 | pre .ruby .string {
75 | color: #DCA3A3;
76 | }
77 |
78 | pre .diff .deletion,
79 | pre .string,
80 | pre .tag .value,
81 | pre .preprocessor,
82 | pre .built_in,
83 | pre .sql .aggregate,
84 | pre .javadoc,
85 | pre .smalltalk .class,
86 | pre .smalltalk .localvars,
87 | pre .smalltalk .array,
88 | pre .css .rules .value,
89 | pre .attr_selector,
90 | pre .pseudo,
91 | pre .apache .cbracket,
92 | pre .tex .formula {
93 | color: #CC9393;
94 | }
95 |
96 | pre .shebang,
97 | pre .diff .addition,
98 | pre .comment,
99 | pre .java .annotation,
100 | pre .template_comment,
101 | pre .pi,
102 | pre .doctype {
103 | color: #7F9F7F;
104 | }
105 |
106 | pre .coffeescript .javascript,
107 | pre .javascript .xml,
108 | pre .tex .formula,
109 | pre .xml .javascript,
110 | pre .xml .vbscript,
111 | pre .xml .css,
112 | pre .xml .cdata {
113 | opacity: 0.5;
114 | }
--------------------------------------------------------------------------------
/www/slides/lib/font/league_gothic-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/www/slides/lib/font/league_gothic-webfont.eot
--------------------------------------------------------------------------------
/www/slides/lib/font/league_gothic-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/www/slides/lib/font/league_gothic-webfont.ttf
--------------------------------------------------------------------------------
/www/slides/lib/font/league_gothic-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/www/slides/lib/font/league_gothic-webfont.woff
--------------------------------------------------------------------------------
/www/slides/lib/font/league_gothic_license:
--------------------------------------------------------------------------------
1 | SIL Open Font License (OFL)
2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
3 |
--------------------------------------------------------------------------------
/www/slides/lib/js/classList.js:
--------------------------------------------------------------------------------
1 | /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
2 | if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p
3 | Copyright Tero Piirainen (tipiirai)
4 | License MIT / http://bit.ly/mit-license
5 | Version 0.96
6 |
7 | http://headjs.com
8 | */(function(a){function z(){d||(d=!0,s(e,function(a){p(a)}))}function y(c,d){var e=a.createElement("script");e.type="text/"+(c.type||"javascript"),e.src=c.src||c,e.async=!1,e.onreadystatechange=e.onload=function(){var a=e.readyState;!d.done&&(!a||/loaded|complete/.test(a))&&(d.done=!0,d())},(a.body||b).appendChild(e)}function x(a,b){if(a.state==o)return b&&b();if(a.state==n)return k.ready(a.name,b);if(a.state==m)return a.onpreload.push(function(){x(a,b)});a.state=n,y(a.url,function(){a.state=o,b&&b(),s(g[a.name],function(a){p(a)}),u()&&d&&s(g.ALL,function(a){p(a)})})}function w(a,b){a.state===undefined&&(a.state=m,a.onpreload=[],y({src:a.url,type:"cache"},function(){v(a)}))}function v(a){a.state=l,s(a.onpreload,function(a){a.call()})}function u(a){a=a||h;var b;for(var c in a){if(a.hasOwnProperty(c)&&a[c].state!=o)return!1;b=!0}return b}function t(a){return Object.prototype.toString.call(a)=="[object Function]"}function s(a,b){if(!!a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c
2 |
3 |
4 |
5 |
6 |
7 |
8 | reveal.js - Slide Notes
9 |
10 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 | UPCOMING:
101 |
102 |
103 |
104 |
105 |
106 |
107 |
140 |
141 |
142 |
143 |
--------------------------------------------------------------------------------
/www/slides/plugin/notes/notes.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Handles opening of and synchronization with the reveal.js
3 | * notes window.
4 | */
5 | var RevealNotes = (function() {
6 |
7 | function openNotes() {
8 | var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path
9 | jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path
10 | var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
11 |
12 | // Fires when slide is changed
13 | Reveal.addEventListener( 'slidechanged', post );
14 |
15 | // Fires when a fragment is shown
16 | Reveal.addEventListener( 'fragmentshown', post );
17 |
18 | // Fires when a fragment is hidden
19 | Reveal.addEventListener( 'fragmenthidden', post );
20 |
21 | /**
22 | * Posts the current slide data to the notes window
23 | */
24 | function post() {
25 | var slideElement = Reveal.getCurrentSlide(),
26 | slideIndices = Reveal.getIndices(),
27 | messageData;
28 |
29 | var notes = slideElement.querySelector( 'aside.notes' ),
30 | nextindexh,
31 | nextindexv;
32 |
33 | if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
34 | nextindexh = slideIndices.h;
35 | nextindexv = slideIndices.v + 1;
36 | } else {
37 | nextindexh = slideIndices.h + 1;
38 | nextindexv = 0;
39 | }
40 |
41 | messageData = {
42 | notes : notes ? notes.innerHTML : '',
43 | indexh : slideIndices.h,
44 | indexv : slideIndices.v,
45 | indexf : slideIndices.f,
46 | nextindexh : nextindexh,
47 | nextindexv : nextindexv,
48 | markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
49 | };
50 |
51 | notesPopup.postMessage( JSON.stringify( messageData ), '*' );
52 | }
53 |
54 | // Navigate to the current slide when the notes are loaded
55 | notesPopup.addEventListener( 'load', function( event ) {
56 | post();
57 | }, false );
58 | }
59 |
60 | // If the there's a 'notes' query set, open directly
61 | if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
62 | openNotes();
63 | }
64 |
65 | // Open the notes when the 's' key is hit
66 | document.addEventListener( 'keydown', function( event ) {
67 | // Disregard the event if the target is editable or a
68 | // modifier is present
69 | if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
70 |
71 | if( event.keyCode === 83 ) {
72 | event.preventDefault();
73 | openNotes();
74 | }
75 | }, false );
76 |
77 | return { open: openNotes };
78 | })();
79 |
--------------------------------------------------------------------------------
/www/slides/plugin/postmessage/example.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/www/slides/plugin/postmessage/postmessage.js:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | simple postmessage plugin
4 |
5 | Useful when a reveal slideshow is inside an iframe.
6 | It allows to call reveal methods from outside.
7 |
8 | Example:
9 | var reveal = window.frames[0];
10 |
11 | // Reveal.prev();
12 | reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
13 | // Reveal.next();
14 | reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
15 | // Reveal.slide(2, 2);
16 | reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
17 |
18 | Add to the slideshow:
19 |
20 | dependencies: [
21 | ...
22 | { src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
23 | ]
24 |
25 | */
26 |
27 | (function (){
28 |
29 | window.addEventListener( "message", function ( event ) {
30 | var data = JSON.parse( event.data ),
31 | method = data.method,
32 | args = data.args;
33 |
34 | if( typeof Reveal[method] === 'function' ) {
35 | Reveal[method].apply( Reveal, data.args );
36 | }
37 | }, false);
38 |
39 | }());
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/www/slides/plugin/print-pdf/print-pdf.js:
--------------------------------------------------------------------------------
1 | /**
2 | * phantomjs script for printing presentations to PDF.
3 | *
4 | * Example:
5 | * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
6 | *
7 | * By Manuel Bieh (https://github.com/manuelbieh)
8 | */
9 |
10 | // html2pdf.js
11 | var page = new WebPage();
12 | var system = require( 'system' );
13 |
14 | page.viewportSize = {
15 | width: 1024,
16 | height: 768
17 | };
18 |
19 | page.paperSize = {
20 | format: 'letter',
21 | orientation: 'landscape',
22 | margin: {
23 | left: '0',
24 | right: '0',
25 | top: '0',
26 | bottom: '0'
27 | }
28 | };
29 |
30 | var revealFile = system.args[1] || 'index.html?print-pdf';
31 | var slideFile = system.args[2] || 'slides.pdf';
32 |
33 | if( slideFile.match( /\.pdf$/gi ) === null ) {
34 | slideFile += '.pdf';
35 | }
36 |
37 | console.log( 'Printing PDF...' );
38 |
39 | page.open( revealFile, function( status ) {
40 | console.log( 'Printed succesfully' );
41 | page.render( slideFile );
42 | phantom.exit();
43 | } );
44 |
45 |
--------------------------------------------------------------------------------
/www/slides/plugin/remotes/remotes.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Touch-based remote controller for your presentation courtesy
3 | * of the folks at http://remotes.io
4 | */
5 |
6 | (function(window){
7 |
8 | /**
9 | * Detects if we are dealing with a touch enabled device (with some false positives)
10 | * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js
11 | */
12 | var hasTouch = (function(){
13 | return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
14 | })();
15 |
16 | /**
17 | * Detects if notes are enable and the current page is opened inside an /iframe
18 | * this prevents loading Remotes.io several times
19 | */
20 | var isNotesAndIframe = (function(){
21 | return window.RevealNotes && !(self == top);
22 | })();
23 |
24 | if(!hasTouch && !isNotesAndIframe){
25 | head.ready( 'remotes.ne.min.js', function() {
26 | new Remotes("preview")
27 | .on("swipe-left", function(e){ Reveal.right(); })
28 | .on("swipe-right", function(e){ Reveal.left(); })
29 | .on("swipe-up", function(e){ Reveal.down(); })
30 | .on("swipe-down", function(e){ Reveal.up(); })
31 | .on("tap", function(e){ Reveal.next(); })
32 | .on("zoom-out", function(e){ Reveal.toggleOverview(true); })
33 | .on("zoom-in", function(e){ Reveal.toggleOverview(false); })
34 | ;
35 | } );
36 |
37 | head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js');
38 | }
39 | })(window);
--------------------------------------------------------------------------------
/www/transform/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'groovy'
2 |
3 | repositories {
4 | mavenCentral()
5 | maven {
6 | url 'http://jcenter.bintray.com'
7 | }
8 | }
9 |
10 | dependencies {
11 | compile 'org.codehaus.groovy:groovy-all:2.4.0'
12 | compile 'uk.co.cacoethes:groovy-handlebars-engine:0.2'
13 | compile 'commons-lang:commons-lang:2.6'
14 | compile 'commons-cli:commons-cli:1.2'
15 | compile 'ch.qos.logback:logback-classic:1.1.2'
16 | }
17 |
18 | task transform(dependsOn: 'classes', type: JavaExec) {
19 | main = 'net.spantree.elasticsearch.talk.TransformExamples'
20 | classpath = sourceSets.main.runtimeClasspath
21 | args = "${arguments}".tokenize(' ')
22 | }
23 |
24 | task copyDependencies(type: Copy) {
25 | from configurations.runtime
26 | into new File("lib")
27 | }
28 |
--------------------------------------------------------------------------------
/www/transform/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Spantree/elasticsearch-talk/53fa9451fd45c4575c346e1be8dc8993e282db7a/www/transform/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/www/transform/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri May 08 23:12:52 CDT 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-bin.zip
7 |
--------------------------------------------------------------------------------
/www/transform/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/www/transform/src/main/groovy/net/spantree/elasticsearch/talk/ExampleParts.groovy:
--------------------------------------------------------------------------------
1 | package net.spantree.elasticsearch.talk
2 |
3 | // use these enums as flags to know which part of the example we're traversing
4 | enum ExampleParts {
5 | TITLE, DESCRIPTION, REQUEST, PAYLOAD
6 | }
7 |
--------------------------------------------------------------------------------
/www/transform/src/main/resources/logback.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/www/visualizations/README.md:
--------------------------------------------------------------------------------
1 | # NFL Elasticsearch Aggregations
2 |
3 | This repository contains the files for the data visualization tutorial using Elasticsearch aggregations (1.0 release) and D3.
4 |
--------------------------------------------------------------------------------
/www/visualizations/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "elasticsearch-talk-visualizations",
3 | "version": "0.0.1",
4 | "dependencies": {
5 | "angular": ">=1.2.0",
6 | "angular-dc": "~0.0.4",
7 | "bootstrap": "~3.2.0",
8 | "crossfilter": "~1.3.7",
9 | "d3": "3.4.11",
10 | "dcjs": "master",
11 | "elasticsearch": "~2.4.0",
12 | "jquery": "~1.10.2",
13 | "underscore": "~1.5.2"
14 | },
15 | "private": true
16 | }
--------------------------------------------------------------------------------
/www/visualizations/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Elasticsearch Visualizations
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
24 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/www/visualizations/morley.csv:
--------------------------------------------------------------------------------
1 | Expt,Run,Speed
2 | 1,1,850
3 | 1,2,740
4 | 1,3,900
5 | 1,4,1070
6 | 1,5,930
7 | 1,6,850
8 | 1,7,950
9 | 1,8,980
10 | 1,9,980
11 | 1,10,880
12 | 1,11,1000
13 | 1,12,980
14 | 1,13,930
15 | 1,14,650
16 | 1,15,760
17 | 1,16,810
18 | 1,17,1000
19 | 1,18,1000
20 | 1,19,960
21 | 1,20,960
22 | 2,1,960
23 | 2,2,940
24 | 2,3,960
25 | 2,4,940
26 | 2,5,880
27 | 2,6,800
28 | 2,7,850
29 | 2,8,880
30 | 2,9,900
31 | 2,10,840
32 | 2,11,830
33 | 2,12,790
34 | 2,13,810
35 | 2,14,880
36 | 2,15,880
37 | 2,16,830
38 | 2,17,800
39 | 2,18,790
40 | 2,19,760
41 | 2,20,800
42 | 3,1,880
43 | 3,2,880
44 | 3,3,880
45 | 3,4,860
46 | 3,5,720
47 | 3,6,720
48 | 3,7,620
49 | 3,8,860
50 | 3,9,970
51 | 3,10,950
52 | 3,11,880
53 | 3,12,910
54 | 3,13,850
55 | 3,14,870
56 | 3,15,840
57 | 3,16,840
58 | 3,17,850
59 | 3,18,840
60 | 3,19,840
61 | 3,20,840
62 | 4,1,890
63 | 4,2,810
64 | 4,3,810
65 | 4,4,820
66 | 4,5,800
67 | 4,6,770
68 | 4,7,760
69 | 4,8,740
70 | 4,9,750
71 | 4,10,760
72 | 4,11,910
73 | 4,12,920
74 | 4,13,890
75 | 4,14,860
76 | 4,15,880
77 | 4,16,720
78 | 4,17,840
79 | 4,18,850
80 | 4,19,850
81 | 4,20,780
82 | 5,1,890
83 | 5,2,840
84 | 5,3,780
85 | 5,4,810
86 | 5,5,760
87 | 5,6,810
88 | 5,7,790
89 | 5,8,810
90 | 5,9,820
91 | 5,10,850
92 | 5,11,870
93 | 5,12,870
94 | 5,13,810
95 | 5,14,740
96 | 5,15,810
97 | 5,16,940
98 | 5,17,950
99 | 5,18,800
100 | 5,19,810
101 | 5,20,870
102 |
--------------------------------------------------------------------------------
/www/visualizations/scripts/main.js:
--------------------------------------------------------------------------------
1 | define(['scripts/d3.v3', 'scripts/elasticsearch'], function(d3, elasticsearch) {
2 |
3 | "use strict";
4 | var client = new elasticsearch.Client({
5 | host: 'estalk.spantree.local:9200'
6 | });
7 |
8 | client.search({
9 | index: 'divvy',
10 | size: 5,
11 | body: {
12 | aggs: {
13 | gender: {
14 | terms: {
15 | field: "gender"
16 | }
17 | }
18 | }
19 | }
20 | }).then(function(resp) {
21 | console.log(resp);
22 |
23 | // D3 code goes here.
24 | var genders = resp.aggregations.gender.buckets;
25 |
26 | // d3 donut chart
27 | var width = 600,
28 | height = 300,
29 | radius = Math.min(width, height) / 2;
30 |
31 | var color = ['#00A9E0', '#D70060', '#61AE24'];
32 |
33 | var arc = d3.svg.arc()
34 | .outerRadius(radius - 60)
35 | .innerRadius(120);
36 |
37 | var pie = d3.layout.pie()
38 | .sort(null)
39 | .value(function(d) {
40 | return d.doc_count;
41 | });
42 |
43 | var svg = d3.select("#donut-chart").append("svg")
44 | .attr("width", width)
45 | .attr("height", height)
46 | .append("g")
47 | .attr("transform", "translate(" + width / 1.4 + "," + height / 2 + ")");
48 |
49 | var g = svg.selectAll(".arc")
50 | .data(pie(genders))
51 | .enter()
52 | .append("g")
53 | .attr("class", "arc");
54 |
55 | g.append("path")
56 | .attr("d", arc)
57 | .style("fill", function(d, i) {
58 | return color[i];
59 | });
60 |
61 | g.append("text")
62 | .attr("transform", function(d) {
63 | return "translate(" + arc.centroid(d) + ")";
64 | })
65 | .attr("dy", ".35em")
66 | .style("text-anchor", "middle")
67 | .style("fill", "black")
68 | .text(function(d) {
69 | return d.data.key;
70 | });
71 | });
72 | });
73 |
--------------------------------------------------------------------------------