├── .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 |
10 | 11 | 20 |

Exercises

21 |
    22 | 23 |
  1. Getting Started
  2. 24 |
  3. Indexing
  4. 25 |
  5. Searching
  6. 26 |
  7. Mapping and Analysis
  8. 27 |
  9. Paging and Sorting
  10. 28 |
  11. Aggregations
  12. 29 |
  13. Percolators
  14. 30 |
  15. More Like This
  16. 31 |
  17. Suggestions
  18. 32 |
33 |
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 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
matchmulti match bool
boosting common terms constant score
dis max filtered fuzzy like this
fuzzy like this field function score fuzzy
geoshape has child has parent
ids indices match all
more like this more like this field nested
prefix query_string simple query
range regexp span first
span multi term span near span not
span or span term term
terms top children wildcard
minimum should match multi term query rewrite
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 |
56 |
57 |
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 | ![Ornaments](images/querying_vs_filtering.svg) 114 | 115 | 116 | ### Queries vs Filters 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 |
QueriesFilters
ScoredBoolean
SlowerFaster
Never cachedCacheable
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:52ZCanvas 1Layer 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 = '' + text + '' : '>'; 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 = ''; 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 | 13 |
14 |
15 |
16 |
17 |
18 |
19 | 20 | 21 | 24 | 27 | 30 | 31 | 32 | 35 | 38 | 41 | 42 | 43 | 46 | 49 | 50 |
22 | Word 23 | 25 | Document 26 | 28 | Positions 29 |
33 | {{entry.word}} 34 | 36 | {{document}} 37 | 39 | {{words.join(', ')}} 40 |
44 | {{document}} 45 | 47 | {{words.join(', ')}} 48 |
51 |
52 |
53 |
54 | -------------------------------------------------------------------------------- /slides/js/templates/_scoring.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | Documents 5 |
6 |
7 | {{docKey}} 8 |
9 |
10 |
11 |
12 | 13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | 22 | 25 | 28 |
29 | 30 | 31 | 33 | 36 | 37 | 38 | 39 | 46 | 47 |
32 | 34 | {{word}} 35 |
{{docKey}} 40 | 41 | 42 | 43 | {{tfidfScores[docKey][word] | number:2}} 44 | 45 |
48 | 51 |
52 |
53 | 54 | 55 | 57 | 60 | 63 | 64 | 65 | 68 | 72 | 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 | ![Analysis phases](images/diagrams/cluster-topology.png#diagram) 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 | ![Query phases](images/diagrams/query-request-data-flow.jpeg#diagram) 140 | 141 | --- 142 | 143 | ### Split brain problem 144 | ![Split Brain](images/diagrams/split-brain.jpeg#diagram) 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 | ![Elasticsearch logo](images/elastic-white.png#plain) 2 | 3 | "You know, for Search!" 4 | 5 | ![Shay Bannon](images/shay-bannon.jpg) 6 | 7 | --- 8 | 9 | ![Cote Tweet](images/cote-tweet.png) 10 | 11 | --- 12 | 13 | ## The Challenge 14 | 15 | ![Simplicity](images/simplicity.png) 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 |
56 | 58 | Formula 59 | 61 | Similarity 62 |
66 | {{docKey}} 67 | 69 | 70 | 71 | 73 | {{getCosSimValue(docKey) | number:2 }} 74 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 |
FilterQueryMatch
LowercaseiPhoneiphone
StemmingRunnerRunning
SynonymsCarAutomobile
Word delimitersShow-offShow off
ASCII FoldingNestléNestle
Pattern Replace+1 (888) 386-55018883865501
Edge NGramelaelasticsearch
114 | 115 | --- 116 | 117 | ### Relational vs Non-Relational 118 | 119 | ![Relational vs Non-Relational Databases](images/diagrams/relational-vs-nonrelational.jpg#diagram) 120 | 121 | --- 122 | 123 | 124 | ### Relational vs Document Model 125 | 126 | ![Relational vs Document Model](images/diagrams/relational-vs-document-model.png#diagram) 127 | -------------------------------------------------------------------------------- /slides/slides/es-is-not.md: -------------------------------------------------------------------------------- 1 | ## Elasticsearch isn't... 2 | 3 | --- 4 | 5 | ### A Relational Database 6 | 7 | ![PostgreSQL](images/postgres.svg#plain) 8 | 9 | --- 10 | 11 | ### Bulletproof 12 | 13 | ![Aphyr](images/screenshots/aphyr-strangeloop-talk.jpg#screenshot) 14 | 15 | --- 16 | 17 | ### A Crawler 18 | 19 | ![Apache Nutch](images/nutch.png#plain) 20 | 21 | --- 22 | 23 | ### A Machine Learner 24 | 25 | ![Apache Mahout](images/mahout.svg#plain) 26 | ![Apache Spark](images/spark.png#plain) 27 | ![Carrot2](images/carrot2.png#plain) 28 | 29 | 30 | --- 31 | 32 | ### A User-Facing Search Experience 33 | 34 | ![Do It Yourself](images/screenshots/searchkit.png#screenshot) 35 | 36 | --- 37 | 38 | ### Secure 39 | 40 | ![Elastic Security](images/screenshots/elastic-security.png#screenshot) 41 | -------------------------------------------------------------------------------- /slides/slides/es-is.md: -------------------------------------------------------------------------------- 1 | ## Elasticsearch is... 2 | 3 | --- 4 | 5 | ### Wicked Fast 6 | 7 | ![ApacheBench Results](images/screenshots/ab-results.png#screenshot) 8 | 9 | --- 10 | 11 | ### Highly Configurable 12 | 13 | ![Kopf Screenshot](images/screenshots/kopf-screenshot.png#screenshot) 14 | 15 | --- 16 | 17 | ### Free and Open Source 18 | 19 | ![ES Github Repo](images/screenshots/elasticsearch-github.png#screenshot) 20 | 21 | --- 22 | 23 | ### Powered by Lucene 24 | 25 | ![Lucene Logo](images/lucene.png#plain) 26 | 27 | --- 28 | 29 | ### Distributed and Fault Tolerant 30 | 31 | ![Node Failure](images/screenshots/kopf-node-failure.png#screenshot) 32 | 33 | --- 34 | 35 | ### Good at Handling Lots of Data 36 | 37 | ![ES Github Big Data](images/es-big-data-github.png#screenshot) 38 | 39 | --- 40 | 41 | ### ...Also Works With Unstructured Data 42 | 43 | ![ES Hamlet](images/es-shakespeare-json.png#screenshot) 44 | 45 | --- 46 | 47 | ### ...and Real-Time Analytics 48 | 49 | ![Kibana](images/screenshots/kibana-screenshot.png) 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 | ![Segment Hierarchy](images/diagrams/segment-hierarchy.jpeg#diagram) 73 | 74 | --- 75 | 76 | ### Segment File Structure 77 | 78 | ![Segment File Structure](images/diagrams/segment-file.png#diagram) 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 | ![Merge flow](images/diagrams/merge-flow.png#plain) 89 | 90 | --- 91 | 92 | ### Merging in Motion 93 | 94 | ![Concurrent Merge Animation](images/animations/lucene-merge-concurrent.gif#diagram) 95 | 96 | --- 97 | 98 | ### Tiered Merging in Motion 99 | 100 | ![Tiered Merge Animation](images/animations/lucene-merge-tiered.gif#diagram) 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 | ![Spantree Logo](images/spantree-white.png#plain) 4 | 5 | ### is talking about 6 | 7 | ![Elastic Logo](images/elastic-white.png#plain) 8 | 9 | --- 10 | 11 | ### Who We Are 12 | 13 | ![Spantree Team](images/team.jpg#diagram) 14 | 15 | --- 16 | 17 | ### Who we work with 18 | 19 |
20 | ![Arena](images/arena.png#white-box) 21 | ![Chicago Cubs](images/cubs.png) 22 | ![Chicago Sun-Times](images/chicago-sun-times.png) 23 | ![Chicago.com](images/chicagocom.png#white-box) 24 | ![Conference Scheduling Solutions](images/conference-solutions.png) 25 | ![CRN.com](images/crn.png) 26 | ![Datascope](images/datascope.png) 27 | ![DeNa](images/dena.png) 28 | ![Doejo](images/doejo.png#white-box) 29 | ![GoHealth](images/gohealth.png) 30 | ![Healthgrades](images/healthgrades.png) 31 | ![High School Cube](images/highschoolcube.png#white-box) 32 | ![Humio](images/humio.svg) 33 | ![MileIQ](images/mileiq.png) 34 | ![Mozilla Foundation](images/mozilla.svg) 35 | ![Northwestern Medicine](images/northwestern-medicine.png#white-box) 36 | ![Panera](images/panera-bread.png) 37 | ![Raise](images/raise.png) 38 | ![Reverb.com](images/reverb.png) 39 | ![Rocketmiles](images/rocketmiles.png#white-box) 40 | ![Yello](images/yello.png) 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 | ![Beats](images/logos/beats.png#plain) 32 | ![Logstash](images/logstash.png#plain) 33 | ![Fluentd](images/fluentd.png#plain) 34 | ![Rsyslog](images/rsyslog.png#plain) 35 | ![Flume](images/flume.png#plain) 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 | ![Elasticsearch](images/elastic.png#plain) 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 | ![Kibana](images/kibana.png) 53 | 54 | --- 55 | 56 | ### What does this look like? 57 | 58 | ![ELK Flow](images/diagrams/beats-logstash-es-flow.png#plain) 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 | ![Percolator Dance](images/percolator.gif) 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 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 |
stringlonginteger
shortbytedouble
floatdateboolean
binarytypeobject
nestedgeo_pointgeo_shape
ipcompletion
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 | ![Analysis Chain](images/diagrams/analysis-chain-with-background.png#diagram) 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 | ![A physical view](images/diagrams/cluster-topology.png#diagram) 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