Mastering ElasticSearch With Ruby (+Tire)

42
Mastering ElasticSearch w/ Ruby (+ Tire) RubyConf 2013 Luca Bonmassar, Gild Tuesday, 5 November 13

description

At RubyConf 2013, Co-founder and Chief Product and Technology Officer, Luca Bonmassar, covered how to build an ElasticSearch using the Ruby Tire Library. Here are the slides from the presentation.

Transcript of Mastering ElasticSearch With Ruby (+Tire)

Page 1: Mastering ElasticSearch With Ruby (+Tire)

MasteringElasticSearch w/ Ruby (+ Tire)

RubyConf 2013

Luca Bonmassar, Gild

Tuesday, 5 November 13

Page 2: Mastering ElasticSearch With Ruby (+Tire)

Who am I?I’m Luca Bonmassar (@openmosix) # 31 # Italian living in San Francisco (and Stockholm)

I work at Gild

I love building products [for fun, profit and boredom]

Tuesday, 5 November 13

Page 3: Mastering ElasticSearch With Ruby (+Tire)

Search - use case You’re building a product

User generated content

Let (other) users find or discover this content

Tuesday, 5 November 13

Page 4: Mastering ElasticSearch With Ruby (+Tire)

Search is NOT easy It usually starts as

but then you want to support AND, OR, NOT, double quotes on multiple fields so

and then it goes like

Tuesday, 5 November 13

Page 5: Mastering ElasticSearch With Ruby (+Tire)

And so it goes...

Tuesday, 5 November 13

Page 6: Mastering ElasticSearch With Ruby (+Tire)

AgendaLet’s define a “pet project”

Boilerplate (download, install, scaffold, config, bla bla bla, yadda, yadda, yadda)

Build a website w/ simple search

Build a more advanced search

What next (homework)

Tuesday, 5 November 13

Page 7: Mastering ElasticSearch With Ruby (+Tire)

Project! (for fun and no profit)

Tuesday, 5 November 13

Page 8: Mastering ElasticSearch With Ruby (+Tire)

Project: build a full text-search for RubyGems.org

Tuesday, 5 November 13

Page 9: Mastering ElasticSearch With Ruby (+Tire)

RubyGems Search Architecture

RubyGems.org

MongoDB

Rails App (Tire)

Elastic Search

Web Spider

Tuesday, 5 November 13

Page 10: Mastering ElasticSearch With Ruby (+Tire)

RubyGems crawler

github.com/openmosix/rubygems-crawler

1. Download all ruby gem names from https://rubygems.org/gems2. Use gems API to download each gem info: read JSON - write JSON (MongoDB)

Tuesday, 5 November 13

Page 11: Mastering ElasticSearch With Ruby (+Tire)

RubyGems Crawler II

Tuesday, 5 November 13

Page 12: Mastering ElasticSearch With Ruby (+Tire)

RubyGems Search v1

Code: github.com/openmosix/rubygems-searchSpoiler: http://rubyconf.bonmassar.it

Tuesday, 5 November 13

Page 13: Mastering ElasticSearch With Ruby (+Tire)

ElasticSearch

Tuesday, 5 November 13

Page 14: Mastering ElasticSearch With Ruby (+Tire)

ElasticSearch II Open source search+analytics engine

Distributed[near] Realtime searchMulti tenantBuilt on Apache Lucene

REST APIsJSON documents

Tuesday, 5 November 13

Page 15: Mastering ElasticSearch With Ruby (+Tire)

1. Download / set up a ES cluster

4. Query Index3. Index Data2. Define settings and data mapping (opt)

ElasticSearch III

Elastic Search MongoDB

Curl>

curl  -­‐X  GET  'h.p://localhost:9200/ruby_gems/_search?from=0&size=25&pre.y'

{    "ok"  :  true,    "status"  :  200,    "version"  :  {        "number"  :  "0.90.5",        "lucene_version"  :  "4.4"    },    "tagline"  :  "You  Know,  for  Search"}

Tuesday, 5 November 13

Page 17: Mastering ElasticSearch With Ruby (+Tire)

ES config > ls elasticsearch-0.90.6/config/

Logging.yml: where to log, how much to logElasticsearch.yml: all server config. Defines:Name of the cluster (change it!!!)Node parameters (master/slave, store data/router)Sharing and # replicasPathsPluginsMemory (JVM, heap, memory locking)Network config“Gateway” (cluster backup)RecoveryDiscoverySlow log + GC log

Default options are good enough for dev env

Tuesday, 5 November 13

Page 18: Mastering ElasticSearch With Ruby (+Tire)

ES boot + test Start: bin/elasticsearch

Test: curl http://localhost:9200/{ "ok" : true, "status" : 200, "name" : "Iron Fist", "version" : { "number" : "0.90.6", "lucene_version" : "4.5.1" }, "tagline" : "You Know, for Search"}

Stop: curl -XPOST 'http://localhost:9200/_shutdown'

{"cluster_name":"elasticsearch","nodes":{"jm2Z3J4dSzebjJ7Px2fAJg":{"name":"Iron Fist"}}}

Tuesday, 5 November 13

Page 19: Mastering ElasticSearch With Ruby (+Tire)

Profit(you are now an ElasticSearch expert - go and tell the world)

Tuesday, 5 November 13

Page 20: Mastering ElasticSearch With Ruby (+Tire)

ElasticSearch operations

Create a “RubyGem” IndexDefines a “RubyGem” Index data mapping

Index data (e.g. upload data from MongoDB to ES index = POST)

Query (= GET)

Tuesday, 5 November 13

Page 21: Mastering ElasticSearch With Ruby (+Tire)

Tire now Re-Tire ;(

A ruby gem wrapping ElasticSearch REST APIs into a powerful ruby DSL

ActiveModel integration

Rake tasks and utilities to load and query ElasticSearch

Tuesday, 5 November 13

Page 22: Mastering ElasticSearch With Ruby (+Tire)

Tire setupcat “gem ‘tire’” > Gemfile && bundle install

> cat config/initializers/elasticsearch.rb...Tire::Configuration.url('http://localhost:9200')Tire.configure { logger "#{Rails.root}/log/elasticsearch-queries.log" } if ENV['ES_LOG']

Tuesday, 5 November 13

Page 23: Mastering ElasticSearch With Ruby (+Tire)

Define an ES index (with Tire DSL)

Tuesday, 5 November 13

Page 24: Mastering ElasticSearch With Ruby (+Tire)

Indexing Get a recordConvert it to JSON format (to_indexed_json)Push it to Elastic Search (.update_index)

...under the hood...

Tuesday, 5 November 13

Page 25: Mastering ElasticSearch With Ruby (+Tire)

Index (all data) Naive (POST on index for each record):

Use bulk updates:

...under the hood...

Tuesday, 5 November 13

Page 26: Mastering ElasticSearch With Ruby (+Tire)

Search I

Tuesday, 5 November 13

Page 27: Mastering ElasticSearch With Ruby (+Tire)

Search II

Tuesday, 5 November 13

Page 28: Mastering ElasticSearch With Ruby (+Tire)

Simple Search

Tuesday, 5 November 13

Page 29: Mastering ElasticSearch With Ruby (+Tire)

Highlight matches

Text

...add some CSS...

Tuesday, 5 November 13

Page 30: Mastering ElasticSearch With Ruby (+Tire)

Advanced Search

Tuesday, 5 November 13

Page 31: Mastering ElasticSearch With Ruby (+Tire)

Advanced Search II

Tuesday, 5 November 13

Page 32: Mastering ElasticSearch With Ruby (+Tire)

Advanced Search III

Tuesday, 5 November 13

Page 33: Mastering ElasticSearch With Ruby (+Tire)

Facets

Tuesday, 5 November 13

Page 34: Mastering ElasticSearch With Ruby (+Tire)

ES facets

Tuesday, 5 November 13

Page 35: Mastering ElasticSearch With Ruby (+Tire)

ES facets (running)

Tuesday, 5 November 13

Page 36: Mastering ElasticSearch With Ruby (+Tire)

Facets - UI

Tuesday, 5 November 13

Page 37: Mastering ElasticSearch With Ruby (+Tire)

Bonsai CoolI Search Suggesters (Did you mean... ?)

Tuesday, 5 November 13

Page 38: Mastering ElasticSearch With Ruby (+Tire)

Bonsai Cool II

“Similar to this” (aka “More Like This” API)

Tuesday, 5 November 13

Page 39: Mastering ElasticSearch With Ruby (+Tire)

Bonsai Cool III

Percolate API

Tuesday, 5 November 13

Page 40: Mastering ElasticSearch With Ruby (+Tire)

DeploymentI Run your own cluster

Some learnings: at least 3 nodesmemory profiling / GCinstall very good monitoring (github.com/karmi/elasticsearch-paramedic)more RAM is (always) betterCheck IOPS (if on AWS)

Pros:Total controlCheaper (lot cheaper)

Cons:Can be a nightmare / Require dedicated devop

Tuesday, 5 November 13

Page 41: Mastering ElasticSearch With Ruby (+Tire)

Deployment II ElasticSearch as a service

http://found.nohttp://searchly.comhttp://bonsai.io

Pros:Get cluster up & running in a minuteFocus on dev, not troubleshootingProfessional support

Cons:ExpensiveCan be in the wrong region / hosting providerExpensiveDid I say expensive?

Tuesday, 5 November 13

Page 42: Mastering ElasticSearch With Ruby (+Tire)

Thanks!Code: github.com/openmosix/rubygems-searchgithub.com/openmosix/rubygems-crawler

Demo (will be down by the end of rubyconf): http://rubyconf.bonmassar.it

Say “hi”:Luca Bonmassar - [email protected]

twitter.com/openmosix

github.com/openmosix

linkedin.com/in/lucabonmassar

Tuesday, 5 November 13