tire 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.travis.yml +3 -0
  2. data/README.markdown +49 -29
  3. data/examples/rails-application-template.rb +15 -15
  4. data/examples/tire-dsl.rb +24 -24
  5. data/lib/tire.rb +2 -1
  6. data/lib/tire/alias.rb +3 -3
  7. data/lib/tire/dsl.rb +17 -19
  8. data/lib/tire/index.rb +67 -10
  9. data/lib/tire/model/callbacks.rb +1 -1
  10. data/lib/tire/model/indexing.rb +2 -2
  11. data/lib/tire/model/naming.rb +1 -1
  12. data/lib/tire/model/percolate.rb +3 -3
  13. data/lib/tire/model/persistence.rb +1 -1
  14. data/lib/tire/model/persistence/attributes.rb +2 -2
  15. data/lib/tire/model/persistence/storage.rb +2 -2
  16. data/lib/tire/model/search.rb +8 -8
  17. data/lib/tire/multi_search.rb +4 -4
  18. data/lib/tire/rubyext/ruby_1_8.rb +1 -1
  19. data/lib/tire/search.rb +1 -1
  20. data/lib/tire/search/scan.rb +1 -1
  21. data/lib/tire/tasks.rb +1 -1
  22. data/lib/tire/version.rb +7 -11
  23. data/test/integration/active_record_searchable_test.rb +42 -0
  24. data/test/integration/dis_max_queries_test.rb +1 -1
  25. data/test/integration/dsl_search_test.rb +9 -0
  26. data/test/integration/index_mapping_test.rb +82 -7
  27. data/test/integration/persistent_model_test.rb +17 -0
  28. data/test/integration/sort_test.rb +16 -0
  29. data/test/models/active_record_models.rb +9 -0
  30. data/test/models/persistent_article.rb +1 -1
  31. data/test/models/persistent_article_in_index.rb +1 -1
  32. data/test/models/persistent_article_in_namespace.rb +1 -1
  33. data/test/models/persistent_article_with_percolation.rb +5 -0
  34. data/test/models/persistent_articles_with_custom_index_name.rb +1 -1
  35. data/test/test_helper.rb +1 -1
  36. data/test/unit/index_alias_test.rb +1 -1
  37. data/test/unit/index_test.rb +79 -1
  38. data/test/unit/model_persistence_test.rb +11 -1
  39. data/test/unit/model_search_test.rb +2 -2
  40. data/test/unit/tire_test.rb +11 -7
  41. data/tire.gemspec +4 -3
  42. metadata +61 -51
@@ -5,6 +5,7 @@
5
5
  language: ruby
6
6
 
7
7
  rvm:
8
+ - 2.0.0
8
9
  - 1.9.3
9
10
  - 1.8.7
10
11
  - ree
@@ -27,6 +28,8 @@ matrix:
27
28
  env: TEST_COMMAND="rake test:integration"
28
29
  - rvm: ree
29
30
  env: TEST_COMMAND="rake test:integration"
31
+ allow_failures:
32
+ - rvm: ree
30
33
 
31
34
  notifications:
32
35
  disable: true
@@ -1,12 +1,12 @@
1
1
  Tire
2
2
  =========
3
3
 
4
- _Tire_ is a Ruby (1.8 or 1.9) client for the [ElasticSearch](http://www.elasticsearch.org/)
4
+ _Tire_ is a Ruby (1.8 or 1.9) client for the [Elasticsearch](http://www.elasticsearch.org/)
5
5
  search engine/database.
6
6
 
7
- _ElasticSearch_ is a scalable, distributed, cloud-ready, highly-available,
7
+ _Elasticsearch_ is a scalable, distributed, cloud-ready, highly-available,
8
8
  full-text search engine and database with
9
- [powerfull aggregation features](http://www.elasticsearch.org/guide/reference/api/search/facets/),
9
+ [powerful aggregation features](http://www.elasticsearch.org/guide/reference/api/search/facets/),
10
10
  communicating by JSON over RESTful HTTP, based on [Lucene](http://lucene.apache.org/), written in Java.
11
11
 
12
12
  This Readme provides a brief overview of _Tire's_ features. The more detailed documentation is at <http://karmi.github.com/tire/>.
@@ -17,11 +17,11 @@ and [issues](https://github.com/karmi/tire/issues).
17
17
  Installation
18
18
  ------------
19
19
 
20
- OK. First, you need a running _ElasticSearch_ server. Thankfully, it's easy. Let's define easy:
20
+ OK. First, you need a running _Elasticsearch_ server. Thankfully, it's easy. Let's define easy:
21
21
 
22
- $ curl -k -L -o elasticsearch-0.19.0.tar.gz http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.0.tar.gz
23
- $ tar -zxvf elasticsearch-0.19.0.tar.gz
24
- $ ./elasticsearch-0.19.0/bin/elasticsearch -f
22
+ $ curl -k -L -o elasticsearch-0.20.2.tar.gz http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz
23
+ $ tar -zxvf elasticsearch-0.20.2.tar.gz
24
+ $ ./elasticsearch-0.20.2/bin/elasticsearch -f
25
25
 
26
26
  See, easy. On a Mac, you can also use _Homebrew_:
27
27
 
@@ -41,11 +41,11 @@ Of course, you can install it from the source as well:
41
41
  Usage
42
42
  -----
43
43
 
44
- _Tire_ exposes easy-to-use domain specific language for fluent communication with _ElasticSearch_.
44
+ _Tire_ exposes easy-to-use domain specific language for fluent communication with _Elasticsearch_.
45
45
 
46
46
  It easily blends with your _ActiveModel_/_ActiveRecord_ classes for convenient usage in _Rails_ applications.
47
47
 
48
- To test-drive the core _ElasticSearch_ functionality, let's require the gem:
48
+ To test-drive the core _Elasticsearch_ functionality, let's require the gem:
49
49
 
50
50
  ```ruby
51
51
  require 'rubygems'
@@ -102,7 +102,7 @@ for a specific document type:
102
102
  ```
103
103
 
104
104
  Of course, we may have large amounts of data, and it may be impossible or impractical to add them to the index
105
- one by one. We can use _ElasticSearch's_
105
+ one by one. We can use _Elasticsearch's_
106
106
  [bulk storage](http://www.elasticsearch.org/guide/reference/api/bulk.html).
107
107
  Notice, that collection items must have an `id` property or method,
108
108
  and should have a `type` property, if you've set any specific mapping for the index.
@@ -344,7 +344,7 @@ When you set the log level to _debug_:
344
344
  the JSON responses are logged as well. This is not a great idea for production environment,
345
345
  but it's priceless when you want to paste a complicated transaction to the mailing list or IRC channel.
346
346
 
347
- The _Tire_ DSL tries hard to provide a strong Ruby-like API for the main _ElasticSearch_ features.
347
+ The _Tire_ DSL tries hard to provide a strong Ruby-like API for the main _Elasticsearch_ features.
348
348
 
349
349
  By default, _Tire_ wraps the results collection in a enumerable `Results::Collection` class,
350
350
  and result items in a `Results::Item` class, which looks like a child of `Hash` and `Openstruct`,
@@ -357,7 +357,7 @@ If that seems like a great idea to you, there's a big chance you already have su
357
357
 
358
358
  One would bet it's an `ActiveRecord` or `ActiveModel` class, containing model of your Rails application.
359
359
 
360
- Fortunately, _Tire_ makes blending _ElasticSearch_ features into your models trivially possible.
360
+ Fortunately, _Tire_ makes blending _Elasticsearch_ features into your models trivially possible.
361
361
 
362
362
 
363
363
  ActiveModel Integration
@@ -365,7 +365,7 @@ ActiveModel Integration
365
365
 
366
366
  If you're the type with no time for lengthy introductions, you can generate a fully working
367
367
  example Rails application, with an `ActiveRecord` model and a search form, to play with
368
- (it even downloads _ElasticSearch_ itself, generates the application skeleton and leaves you with
368
+ (it even downloads _Elasticsearch_ itself, generates the application skeleton and leaves you with
369
369
  a _Git_ repository to explore the steps and the code):
370
370
 
371
371
  $ rails new searchapp -m https://raw.github.com/karmi/tire/master/examples/rails-application-template.rb
@@ -384,7 +384,7 @@ To make it searchable with _Tire_, just `include` it:
384
384
  When you now save a record:
385
385
 
386
386
  ```ruby
387
- Article.create :title => "I Love ElasticSearch",
387
+ Article.create :title => "I Love Elasticsearch",
388
388
  :content => "...",
389
389
  :author => "Captain Nemo",
390
390
  :published_on => Time.now
@@ -529,7 +529,7 @@ The easiest way is to customize the `to_json` serialization support of your mode
529
529
  class Article < ActiveRecord::Base
530
530
  # ...
531
531
 
532
- include_root_in_json = false
532
+ self.include_root_in_json = false
533
533
  def to_indexed_json
534
534
  to_json :except => ['updated_at'], :methods => ['length']
535
535
  end
@@ -574,9 +574,12 @@ control on how the documents are added to or removed from the index:
574
574
  end
575
575
  ```
576
576
 
577
+ When you're integrating _Tire_ with ActiveRecord models, you should use the `after_commit`
578
+ and `after_rollback` hooks to keep the index in sync with your database.
579
+
577
580
  The results returned by `Article.search` are wrapped in the aforementioned `Item` class, by default.
578
- This way, we have a fast and flexible access to the properties returned from _ElasticSearch_ (via the
579
- `_source` or `fields` JSON properties). This way, we can index whatever JSON we like in _ElasticSearch_,
581
+ This way, we have a fast and flexible access to the properties returned from _Elasticsearch_ (via the
582
+ `_source` or `fields` JSON properties). This way, we can index whatever JSON we like in _Elasticsearch_,
580
583
  and retrieve it, simply, via the dot notation:
581
584
 
582
585
  ```ruby
@@ -588,18 +591,18 @@ and retrieve it, simply, via the dot notation:
588
591
  ```
589
592
 
590
593
  The `Item` instances masquerade themselves as instances of your model within a _Rails_ application
591
- (based on the `_type` property retrieved from _ElasticSearch_), so you can use them carefree;
594
+ (based on the `_type` property retrieved from _Elasticsearch_), so you can use them carefree;
592
595
  all the `url_for` or `dom_id` helpers work as expected.
593
596
 
594
- If you need to access the “real” model (eg. to access its assocations or methods not
595
- stored in _ElasticSearch_), just load it from the database:
597
+ If you need to access the “real” model (eg. to access its associations or methods not
598
+ stored in _Elasticsearch_), just load it from the database:
596
599
 
597
600
  ```ruby
598
601
  puts article.load(:include => 'comments').comments.size
599
602
  ```
600
603
 
601
604
  You can see that _Tire_ stays as far from the database as possible. That's because it believes
602
- you have most of the data you want to display stored in _ElasticSearch_. When you need
605
+ you have most of the data you want to display stored in _Elasticsearch_. When you need
603
606
  to eagerly load the records from the database itself, for whatever reason,
604
607
  you can do it with the `:load` option when searching:
605
608
 
@@ -636,14 +639,14 @@ so you can pass all the usual parameters to the `search` method in the controlle
636
639
  @articles = Article.search params[:q], :page => (params[:page] || 1)
637
640
  ```
638
641
 
639
- OK. Chances are, you have lots of records stored in your database. How will you get them to _ElasticSearch_? Easy:
642
+ OK. Chances are, you have lots of records stored in your database. How will you get them to _Elasticsearch_? Easy:
640
643
 
641
644
  ```ruby
642
645
  Article.index.import Article.all
643
646
  ```
644
647
 
645
648
  This way, however, all your records are loaded into memory, serialized into JSON,
646
- and sent down the wire to _ElasticSearch_. Not practical, you say? You're right.
649
+ and sent down the wire to _Elasticsearch_. Not practical, you say? You're right.
647
650
 
648
651
  Provided your model implements some sort of _pagination_ — and it probably does —, you can just run:
649
652
 
@@ -661,7 +664,7 @@ in chunks of 1000. If that number doesn't suit you, just provide a better one:
661
664
  Any other parameters you provide to the `import` method are passed down to the `paginate` method.
662
665
 
663
666
  Are we saying you have to fiddle with this thing in a `rails console` or silly Ruby scripts? No.
664
- Just call the included _Rake_ task on the commandline:
667
+ Just call the included _Rake_ task on the command line:
665
668
 
666
669
  ```bash
667
670
  $ rake environment tire:import CLASS='Article'
@@ -674,7 +677,14 @@ provided by the `mapping` block in your model):
674
677
  $ rake environment tire:import CLASS='Article' FORCE=true
675
678
  ```
676
679
 
677
- When you'll spend more time with _ElasticSearch_, you'll notice how
680
+ When importing records from multiple tables, you can fight the n+1 queries problem by passing
681
+ `include` parameters to the `paginate` method:
682
+
683
+ ```bash
684
+ rake environment tire:import PARAMS='{:include => ["comments"]}' CLASS=Article FORCE=true
685
+ ```
686
+
687
+ When you'll spend more time with _Elasticsearch_, you'll notice how
678
688
  [index aliases](http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html)
679
689
  are the best idea since the invention of inverted index.
680
690
  You can index your data into a fresh index (and possibly update an alias once everything's fine):
@@ -683,6 +693,16 @@ You can index your data into a fresh index (and possibly update an alias once ev
683
693
  $ rake environment tire:import CLASS='Article' INDEX='articles-2011-05'
684
694
  ```
685
695
 
696
+ Finally, consider the Rake importing task just a convenient starting point. If you're loading
697
+ substantial amounts of data, want better control on which data will be indexed, etc., use the
698
+ lower-level Tire API with eg. `ActiveRecordBase#find_in_batches`:
699
+
700
+ ```ruby
701
+ Article.where("published_on > ?", Time.parse("2012-10-01")).find_in_batches do |group|
702
+ Tire.index("articles").import group
703
+ end
704
+ ```
705
+
686
706
  OK. All this time we have been talking about `ActiveRecord` models, since
687
707
  it is a reasonable _Rails_' default for the storage layer.
688
708
 
@@ -708,7 +728,7 @@ Well, things stay mostly the same:
708
728
 
709
729
  end
710
730
 
711
- Article.create :title => 'I Love ElasticSearch'
731
+ Article.create :title => 'I Love Elasticsearch'
712
732
 
713
733
  Article.tire.search 'love'
714
734
  ```
@@ -723,9 +743,9 @@ database to store stuff like `{ :name => 'Tire', :tags => [ 'ruby', 'search' ] }
723
743
  Because all you need, really, is to just dump a JSON-representation of your data into a database and load it back again.
724
744
  Because you've noticed that _searching_ your data is a much more effective way of retrieval
725
745
  then constructing elaborate database query conditions.
726
- Because you have _lots_ of data and want to use _ElasticSearch's_ advanced distributed features.
746
+ Because you have _lots_ of data and want to use _Elasticsearch's_ advanced distributed features.
727
747
 
728
- All good reasons to use _ElasticSearch_ as a schema-free and highly-scalable storage and retrieval/aggregation engine for your data.
748
+ All good reasons to use _Elasticsearch_ as a schema-free and highly-scalable storage and retrieval/aggregation engine for your data.
729
749
 
730
750
  To use the persistence mode, we'll include the `Tire::Persistence` module in our class and define its properties;
731
751
  we can add the standard mapping declarations, set default values, or define casting for the property to create
@@ -759,7 +779,7 @@ and extensions to the core _Tire_ functionality — be sure to check them out.
759
779
  Other Clients
760
780
  -------------
761
781
 
762
- Check out [other _ElasticSearch_ clients](http://www.elasticsearch.org/guide/appendix/clients.html).
782
+ Check out [other _Elasticsearch_ clients](http://www.elasticsearch.org/guide/appendix/clients.html).
763
783
 
764
784
 
765
785
  Feedback
@@ -1,8 +1,8 @@
1
1
  # ===================================================================================================================
2
- # Template for generating a no-frills Rails application with support for ElasticSearch full-text search via Tire
2
+ # Template for generating a no-frills Rails application with support for Elasticsearch full-text search via Tire
3
3
  # ===================================================================================================================
4
4
  #
5
- # This file creates a basic, fully working Rails application with support for ElasticSearch full-text search
5
+ # This file creates a basic, fully working Rails application with support for Elasticsearch full-text search
6
6
  # via the Tire gem [http://github.com/karmi/tire].
7
7
  #
8
8
  # You DON'T NEED ELASTICSEARCH INSTALLED, it is installed and launched automatically by this script.
@@ -14,7 +14,7 @@
14
14
  # * Ruby >= 1.8.7
15
15
  # * Rubygems
16
16
  # * Rails >= 3.0.7
17
- # * Sun Java 6 (for ElasticSearch)
17
+ # * Sun Java 6 (for Elasticsearch)
18
18
  #
19
19
  #
20
20
  # Usage
@@ -46,7 +46,7 @@ end
46
46
  at_exit do
47
47
  pid = File.read("#{destination_root}/tmp/pids/elasticsearch.pid") rescue nil
48
48
  if pid
49
- say_status "Stop", "ElasticSearch", :yellow
49
+ say_status "Stop", "Elasticsearch", :yellow
50
50
  run "kill #{pid}"
51
51
  end
52
52
  end
@@ -62,7 +62,7 @@ file ".gitignore", <<-END.gsub(/ /, '')
62
62
  tmp/**/*
63
63
  config/database.yml
64
64
  db/*.sqlite3
65
- vendor/elasticsearch-0.19.0/
65
+ vendor/elasticsearch-0.20.2/
66
66
  END
67
67
 
68
68
  git :init
@@ -71,32 +71,32 @@ git :commit => "-m 'Initial commit: Clean application'"
71
71
 
72
72
  unless (RestClient.get('http://localhost:9200') rescue false)
73
73
  COMMAND = <<-COMMAND.gsub(/^ /, '')
74
- curl -k -L -# -o elasticsearch-0.19.0.tar.gz \
75
- "http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.0.tar.gz"
76
- tar -zxf elasticsearch-0.19.0.tar.gz
77
- rm -f elasticsearch-0.19.0.tar.gz
78
- ./elasticsearch-0.19.0/bin/elasticsearch -p #{destination_root}/tmp/pids/elasticsearch.pid
74
+ curl -k -L -# -o elasticsearch-0.20.2.tar.gz \
75
+ "http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz"
76
+ tar -zxf elasticsearch-0.20.2.tar.gz
77
+ rm -f elasticsearch-0.20.2.tar.gz
78
+ ./elasticsearch-0.20.2/bin/elasticsearch -p #{destination_root}/tmp/pids/elasticsearch.pid
79
79
  COMMAND
80
80
 
81
81
  puts "\n"
82
- say_status "ERROR", "ElasticSearch not running!\n", :red
82
+ say_status "ERROR", "Elasticsearch not running!\n", :red
83
83
  puts '-'*80
84
- say_status '', "It appears that ElasticSearch is not running on this machine."
84
+ say_status '', "It appears that Elasticsearch is not running on this machine."
85
85
  say_status '', "Is it installed? Do you want me to install it for you with this command?\n\n"
86
86
  COMMAND.each_line { |l| say_status '', "$ #{l}" }
87
87
  puts
88
88
  say_status '', "(To uninstall, just remove the generated application directory.)"
89
89
  puts '-'*80, ''
90
90
 
91
- if yes?("Install ElasticSearch?", :bold)
91
+ if yes?("Install Elasticsearch?", :bold)
92
92
  puts
93
- say_status "Install", "ElasticSearch", :yellow
93
+ say_status "Install", "Elasticsearch", :yellow
94
94
 
95
95
  commands = COMMAND.split("\n")
96
96
  exec = commands.pop
97
97
  inside("vendor") do
98
98
  commands.each { |command| run command }
99
- run "(#{exec})" # Launch ElasticSearch in subshell
99
+ run "(#{exec})" # Launch Elasticsearch in subshell
100
100
  end
101
101
  end
102
102
  end
@@ -1,9 +1,9 @@
1
1
  # encoding: UTF-8
2
2
  #
3
3
  # **Tire** provides rich and comfortable Ruby API for the
4
- # [_ElasticSearch_](http://www.elasticsearch.org/) search engine/database.
4
+ # [_Elasticsearch_](http://www.elasticsearch.org/) search engine/database.
5
5
  #
6
- # _ElasticSearch_ is a scalable, distributed, cloud-ready, highly-available
6
+ # _Elasticsearch_ is a scalable, distributed, cloud-ready, highly-available
7
7
  # full-text search engine and database, communicating by JSON over RESTful HTTP,
8
8
  # based on [Lucene](http://lucene.apache.org/), written in Java.
9
9
  #
@@ -40,14 +40,14 @@ require 'tire'
40
40
 
41
41
  #### Prerequisites
42
42
 
43
- # We'll need a working and running _ElasticSearch_ server, of course. Thankfully, that's easy.
43
+ # We'll need a working and running _Elasticsearch_ server, of course. Thankfully, that's easy.
44
44
  ( puts <<-"INSTALL" ; exit(1) ) unless (RestClient.get('http://localhost:9200') rescue false)
45
45
 
46
- [ERROR] You don’t appear to have ElasticSearch installed. Please install and launch it with the following commands:
46
+ [ERROR] You don’t appear to have Elasticsearch installed. Please install and launch it with the following commands:
47
47
 
48
- curl -k -L -o elasticsearch-0.19.0.tar.gz http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.0.tar.gz
49
- tar -zxvf elasticsearch-0.19.0.tar.gz
50
- ./elasticsearch-0.19.0/bin/elasticsearch -f
48
+ curl -k -L -o elasticsearch-0.20.2.tar.gz http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz
49
+ tar -zxvf elasticsearch-0.20.2.tar.gz
50
+ ./elasticsearch-0.20.2/bin/elasticsearch -f
51
51
  INSTALL
52
52
 
53
53
  ### Storing and indexing documents
@@ -68,7 +68,7 @@ Tire.index 'articles' do
68
68
  store :title => 'One', :tags => ['ruby'], :published_on => '2011-01-01'
69
69
  store :title => 'Two', :tags => ['ruby', 'python'], :published_on => '2011-01-02'
70
70
 
71
- # We usually want to set a specific _type_ for the document in _ElasticSearch_.
71
+ # We usually want to set a specific _type_ for the document in _Elasticsearch_.
72
72
  # Simply setting a `type` property is OK.
73
73
  #
74
74
  store :type => 'article',
@@ -137,7 +137,7 @@ Tire.index 'articles' do
137
137
  #
138
138
  :id => { :type => 'string', :index => 'not_analyzed', :include_in_all => false },
139
139
 
140
- # ... set the boost or analyzer settings for the field, etc. The _ElasticSearch_ guide
140
+ # ... set the boost or analyzer settings for the field, etc. The _Elasticsearch_ guide
141
141
  # has [more information](http://elasticsearch.org/guide/reference/mapping/index.html).
142
142
  # Don't forget, that proper mapping is key to efficient and effective search.
143
143
  # But don't fret about getting the mapping right the first time, you won't.
@@ -154,7 +154,7 @@ end
154
154
  #### Bulk Indexing
155
155
 
156
156
  # Of course, we may have large amounts of data, and adding them to the index one by one really isn't the best idea.
157
- # We can use _ElasticSearch's_ [bulk API](http://www.elasticsearch.org/guide/reference/api/bulk.html)
157
+ # We can use _Elasticsearch's_ [bulk API](http://www.elasticsearch.org/guide/reference/api/bulk.html)
158
158
  # for importing the data.
159
159
 
160
160
  # So, for demonstration purposes, let's suppose we have a simple collection of hashes to store.
@@ -197,7 +197,7 @@ end
197
197
 
198
198
  ### Searching
199
199
 
200
- # With the documents indexed and stored in the _ElasticSearch_ database, we can search them, finally.
200
+ # With the documents indexed and stored in the _Elasticsearch_ database, we can search them, finally.
201
201
  #
202
202
  # _Tire_ exposes the search interface via simple domain-specific language.
203
203
 
@@ -289,7 +289,7 @@ end
289
289
  # We may use any valid [Lucene query syntax](http://lucene.apache.org/java/3_0_3/queryparsersyntax.html)
290
290
  # for the `query_string` queries.
291
291
 
292
- # For debugging our queries, we can display the JSON which is being sent to _ElasticSearch_.
292
+ # For debugging our queries, we can display the JSON which is being sent to _Elasticsearch_.
293
293
  #
294
294
  # {"query":{"query_string":{"query":"title:T*"}}}
295
295
  #
@@ -342,7 +342,7 @@ end
342
342
  #
343
343
  Tire.configure do
344
344
 
345
- # First of all, we can configure the URL for _ElasticSearch_.
345
+ # First of all, we can configure the URL for _Elasticsearch_.
346
346
  #
347
347
  url "http://search.example.com"
348
348
 
@@ -362,7 +362,7 @@ end
362
362
  ### Complex Searching
363
363
 
364
364
  # Query strings are convenient for simple searches, but we may want to define our queries more expressively,
365
- # using the _ElasticSearch_ [Query DSL](http://www.elasticsearch.org/guide/reference/query-dsl/index.html).
365
+ # using the _Elasticsearch_ [Query DSL](http://www.elasticsearch.org/guide/reference/query-dsl/index.html).
366
366
  #
367
367
  s = Tire.search('articles') do
368
368
 
@@ -471,7 +471,7 @@ Tire.search('articles') do
471
471
  end
472
472
  end
473
473
 
474
- # _ElasticSearch_ supports many types of [queries](http://www.elasticsearch.org/guide/reference/query-dsl/).
474
+ # _Elasticsearch_ supports many types of [queries](http://www.elasticsearch.org/guide/reference/query-dsl/).
475
475
  #
476
476
  # Eventually, _Tire_ will support all of them. So far, only these are supported:
477
477
  #
@@ -487,7 +487,7 @@ end
487
487
 
488
488
  #### Faceted Search
489
489
 
490
- # _ElasticSearch_ makes it trivial to retrieve complex aggregated data from our index/database,
490
+ # _Elasticsearch_ makes it trivial to retrieve complex aggregated data from our index/database,
491
491
  # so called [_facets_](http://www.elasticsearch.org/guide/reference/api/search/facets/index.html).
492
492
 
493
493
  # Let's say we want to display article counts for every tag in the database.
@@ -579,7 +579,7 @@ s.results.facets['global-tags']['terms'].each do |f|
579
579
  puts "#{f['term'].ljust(10)} #{f['count']}"
580
580
  end
581
581
 
582
- # _ElasticSearch_ supports many advanced types of facets, such as those for computing statistics or geographical distance.
582
+ # _Elasticsearch_ supports many advanced types of facets, such as those for computing statistics or geographical distance.
583
583
  #
584
584
  # Eventually, _Tire_ will support all of them. So far, only these are supported:
585
585
  #
@@ -591,7 +591,7 @@ end
591
591
  # * [terms_stats](http://www.elasticsearch.org/guide/reference/api/search/facets/terms-stats-facet.html)
592
592
  # * [query](http://www.elasticsearch.org/guide/reference/api/search/facets/query-facet.html)
593
593
 
594
- # We have seen that _ElasticSearch_ facets enable us to fetch complex aggregations from our data.
594
+ # We have seen that _Elasticsearch_ facets enable us to fetch complex aggregations from our data.
595
595
  #
596
596
  # They are frequently used for another feature, „faceted navigation“.
597
597
  # We can be combine query and facets with
@@ -777,7 +777,7 @@ end
777
777
  #### Highlighting
778
778
 
779
779
  # Often, we want to highlight the snippets matching our query in the displayed results.
780
- # _ElasticSearch_ provides rich
780
+ # _Elasticsearch_ provides rich
781
781
  # [highlighting](http://www.elasticsearch.org/guide/reference/api/search/highlighting.html)
782
782
  # features, and _Tire_ makes them trivial to use.
783
783
  #
@@ -786,7 +786,7 @@ s = Tire.search 'articles' do
786
786
  # Let's search for documents containing word “Two” in their titles,
787
787
  query { string 'title:Two' }
788
788
 
789
- # and instruct _ElasticSearch_ to highlight relevant snippets.
789
+ # and instruct _Elasticsearch_ to highlight relevant snippets.
790
790
  #
791
791
  highlight :title
792
792
  end
@@ -818,7 +818,7 @@ end
818
818
 
819
819
  #### Percolation
820
820
 
821
- # _ElasticSearch_ comes with one very interesting, and rather unique feature:
821
+ # _Elasticsearch_ comes with one very interesting, and rather unique feature:
822
822
  # [_percolation_](http://www.elasticsearch.org/guide/reference/api/percolate.html).
823
823
 
824
824
  # It works in a „reverse search“ manner to regular search workflow of adding
@@ -848,7 +848,7 @@ index = Tire.index('weather') do
848
848
  end
849
849
 
850
850
  # Notice, that we have added a _tags_ field to the query document, because it behaves
851
- # just like any other document in _ElasticSearch_.
851
+ # just like any other document in _Elasticsearch_.
852
852
 
853
853
  # We will refresh the `_percolator` index for immediate access.
854
854
  #
@@ -864,7 +864,7 @@ matches = index.percolate(:message => '[Warning] Extreme flooding expected after
864
864
  #
865
865
  puts "Matching queries: " + matches.inspect
866
866
 
867
- # We can filter the executed queries with a regular _ElasticSearch_ query passed as a block to
867
+ # We can filter the executed queries with a regular _Elasticsearch_ query passed as a block to
868
868
  # the `percolate` method.
869
869
  #
870
870
  matches = index.percolate(:message => '[Warning] Extreme flooding expected after tsunami wave.') do
@@ -918,7 +918,7 @@ puts "Matching queries: " + response['matches'].inspect
918
918
  ### ActiveModel Integration
919
919
 
920
920
  # As you can see, [_Tire_](https://github.com/karmi/tire) supports the
921
- # main features of _ElasticSearch_ in Ruby.
921
+ # main features of _Elasticsearch_ in Ruby.
922
922
  #
923
923
  # It allows you to create and delete indices, add documents, search them, retrieve the facets, highlight the results,
924
924
  # and comes with a usable logging facility.