tire 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -1
- data/.yardopts +1 -0
- data/README.markdown +2 -2
- data/examples/rails-application-template.rb +20 -6
- data/lib/tire.rb +2 -0
- data/lib/tire/alias.rb +1 -1
- data/lib/tire/configuration.rb +8 -0
- data/lib/tire/dsl.rb +69 -2
- data/lib/tire/index.rb +33 -20
- data/lib/tire/model/indexing.rb +7 -1
- data/lib/tire/model/persistence.rb +7 -4
- data/lib/tire/model/persistence/attributes.rb +1 -1
- data/lib/tire/model/persistence/finders.rb +4 -16
- data/lib/tire/model/search.rb +21 -8
- data/lib/tire/multi_search.rb +263 -0
- data/lib/tire/results/collection.rb +78 -49
- data/lib/tire/results/item.rb +6 -3
- data/lib/tire/results/pagination.rb +15 -1
- data/lib/tire/rubyext/ruby_1_8.rb +1 -7
- data/lib/tire/rubyext/uri_escape.rb +74 -0
- data/lib/tire/search.rb +33 -11
- data/lib/tire/search/facet.rb +8 -3
- data/lib/tire/search/filter.rb +1 -1
- data/lib/tire/search/highlight.rb +1 -1
- data/lib/tire/search/queries/match.rb +40 -0
- data/lib/tire/search/query.rb +42 -6
- data/lib/tire/search/scan.rb +1 -1
- data/lib/tire/search/script_field.rb +1 -1
- data/lib/tire/search/sort.rb +1 -1
- data/lib/tire/tasks.rb +17 -14
- data/lib/tire/version.rb +26 -8
- data/test/integration/active_record_searchable_test.rb +248 -129
- data/test/integration/boosting_queries_test.rb +32 -0
- data/test/integration/custom_score_queries_test.rb +1 -0
- data/test/integration/dsl_search_test.rb +9 -1
- data/test/integration/facets_test.rb +19 -6
- data/test/integration/match_query_test.rb +79 -0
- data/test/integration/multi_search_test.rb +114 -0
- data/test/integration/persistent_model_test.rb +58 -0
- data/test/models/article.rb +1 -1
- data/test/models/persistent_article_in_index.rb +16 -0
- data/test/models/persistent_article_with_defaults.rb +4 -3
- data/test/test_helper.rb +3 -1
- data/test/unit/configuration_test.rb +10 -0
- data/test/unit/index_test.rb +69 -27
- data/test/unit/model_initialization_test.rb +31 -0
- data/test/unit/model_persistence_test.rb +21 -7
- data/test/unit/model_search_test.rb +56 -5
- data/test/unit/multi_search_test.rb +304 -0
- data/test/unit/results_collection_test.rb +42 -2
- data/test/unit/results_item_test.rb +4 -0
- data/test/unit/search_facet_test.rb +35 -11
- data/test/unit/search_query_test.rb +96 -0
- data/test/unit/search_test.rb +60 -3
- data/test/unit/tire_test.rb +14 -0
- data/tire.gemspec +0 -1
- metadata +75 -44
@@ -10,7 +10,8 @@ module Tire
|
|
10
10
|
Configuration.reset
|
11
11
|
@default_response = { 'hits' => { 'hits' => [{'_id' => 1, '_score' => 1, '_source' => {:title => 'Test'}},
|
12
12
|
{'_id' => 2},
|
13
|
-
{'_id' => 3}]
|
13
|
+
{'_id' => 3}],
|
14
|
+
'max_score' => 1.0 } }
|
14
15
|
end
|
15
16
|
|
16
17
|
should "be iterable" do
|
@@ -32,6 +33,11 @@ module Tire
|
|
32
33
|
assert_equal 2, Results::Collection.new(@default_response)[1][:id]
|
33
34
|
end
|
34
35
|
|
36
|
+
should "allow slicing" do
|
37
|
+
assert_equal [2,3], Results::Collection.new(@default_response)[1,2].map {|res| res[:id]}
|
38
|
+
assert_equal [3], Results::Collection.new(@default_response)[-1,1].map {|res| res[:id]}
|
39
|
+
end
|
40
|
+
|
35
41
|
should "be initialized with parsed json" do
|
36
42
|
assert_nothing_raised do
|
37
43
|
collection = Results::Collection.new( @default_response )
|
@@ -39,6 +45,10 @@ module Tire
|
|
39
45
|
end
|
40
46
|
end
|
41
47
|
|
48
|
+
should "return success/failure state" do
|
49
|
+
assert Results::Collection.new( @default_response ).success?
|
50
|
+
end
|
51
|
+
|
42
52
|
should "be populated lazily" do
|
43
53
|
collection = Results::Collection.new(@default_response)
|
44
54
|
assert_nil collection.instance_variable_get(:@results)
|
@@ -59,11 +69,34 @@ module Tire
|
|
59
69
|
|
60
70
|
should "be kaminari compatible" do
|
61
71
|
collection = Results::Collection.new(@default_response)
|
62
|
-
%w(limit_value total_count num_pages offset_value).each do |method|
|
72
|
+
%w(limit_value total_count num_pages offset_value first_page? last_page?).each do |method|
|
63
73
|
assert_respond_to collection, method
|
64
74
|
end
|
65
75
|
end
|
66
76
|
|
77
|
+
should "have max_score" do
|
78
|
+
collection = Results::Collection.new(@default_response)
|
79
|
+
assert_equal 1.0, collection.max_score
|
80
|
+
end
|
81
|
+
|
82
|
+
context "with error response" do
|
83
|
+
setup do
|
84
|
+
@collection = Results::Collection.new({'error' => 'SearchPhaseExecutionException...'})
|
85
|
+
end
|
86
|
+
|
87
|
+
should "return the error" do
|
88
|
+
assert_equal 'SearchPhaseExecutionException...', @collection.error
|
89
|
+
end
|
90
|
+
|
91
|
+
should "return the success/failure state" do
|
92
|
+
assert @collection.failure?
|
93
|
+
end
|
94
|
+
|
95
|
+
should "return empty results" do
|
96
|
+
assert @collection.empty?
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
67
100
|
context "wrapping results" do
|
68
101
|
|
69
102
|
setup do
|
@@ -212,6 +245,13 @@ module Tire
|
|
212
245
|
assert_equal 3, @collection.next_page
|
213
246
|
end
|
214
247
|
|
248
|
+
should "have default per_page" do
|
249
|
+
assert_equal 10, Tire::Results::Pagination::default_per_page
|
250
|
+
|
251
|
+
collection = Results::Collection.new @default_response
|
252
|
+
assert_equal 10, collection.per_page
|
253
|
+
end
|
254
|
+
|
215
255
|
end
|
216
256
|
|
217
257
|
context "with eager loading" do
|
@@ -65,6 +65,10 @@ module Tire
|
|
65
65
|
assert_equal 'Test', @document.title
|
66
66
|
end
|
67
67
|
|
68
|
+
should "implement respond_to? for proxied methods" do
|
69
|
+
assert @document.respond_to?(:title)
|
70
|
+
end
|
71
|
+
|
68
72
|
should "return nil for non-existing keys/methods" do
|
69
73
|
assert_nothing_raised { @document.whatever }
|
70
74
|
assert_nil @document.whatever
|
@@ -13,13 +13,13 @@ module Tire::Search
|
|
13
13
|
context "generally" do
|
14
14
|
|
15
15
|
should "encode facets with defaults for current query" do
|
16
|
-
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json,
|
17
|
-
Facet.new('foo').terms(:bar).to_json )
|
16
|
+
assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json),
|
17
|
+
MultiJson.load(Facet.new('foo').terms(:bar).to_json) )
|
18
18
|
end
|
19
19
|
|
20
20
|
should "encode facets as global" do
|
21
|
-
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false}, :global => true } }.to_json,
|
22
|
-
Facet.new('foo', :global => true).terms(:bar).to_json )
|
21
|
+
assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false}, :global => true } }.to_json),
|
22
|
+
MultiJson.load(Facet.new('foo', :global => true).terms(:bar).to_json) )
|
23
23
|
end
|
24
24
|
|
25
25
|
should "pass options to facets" do
|
@@ -31,15 +31,16 @@ module Tire::Search
|
|
31
31
|
end
|
32
32
|
|
33
33
|
should "encode facet options" do
|
34
|
-
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false} } }.to_json,
|
35
|
-
Facet.new('foo').terms(:bar, :size => 5).to_json )
|
34
|
+
assert_equal( MultiJson.load( { :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false} } }.to_json ),
|
35
|
+
MultiJson.load( Facet.new('foo').terms(:bar, :size => 5).to_json ) )
|
36
36
|
end
|
37
37
|
|
38
38
|
should "encode facets when passed as a block" do
|
39
39
|
f = Facet.new('foo') do
|
40
40
|
terms :bar
|
41
41
|
end
|
42
|
-
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json,
|
42
|
+
assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json),
|
43
|
+
MultiJson.load(f.to_json) )
|
43
44
|
end
|
44
45
|
|
45
46
|
should "encode facets when passed as a block, using variables from outer scope" do
|
@@ -48,7 +49,28 @@ module Tire::Search
|
|
48
49
|
f = Facet.new('foo') do |facet|
|
49
50
|
facet.terms foo, :size => 20
|
50
51
|
end
|
51
|
-
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>20,:all_terms=>false} } }.to_json,
|
52
|
+
assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>20,:all_terms=>false} } }.to_json),
|
53
|
+
MultiJson.load(f.to_json) )
|
54
|
+
end
|
55
|
+
|
56
|
+
should "encode facet_filter option with DSL" do
|
57
|
+
f = Facet.new('foo'){
|
58
|
+
terms :published_on
|
59
|
+
facet_filter :terms, :tags => ['ruby']
|
60
|
+
}.to_hash
|
61
|
+
|
62
|
+
assert_equal( { :terms => {:tags => ['ruby'] }}.to_json, f['foo'][:facet_filter].to_json)
|
63
|
+
end
|
64
|
+
|
65
|
+
should "encode multiple facet_filter options with DSL" do
|
66
|
+
f = Facet.new('foo'){
|
67
|
+
terms :published_on
|
68
|
+
facet_filter :and, { :tags => ['ruby'] },
|
69
|
+
{ :words => 250 }
|
70
|
+
}.to_hash
|
71
|
+
|
72
|
+
assert_equal( { :and => [{:tags => ['ruby']}, {:words => 250 }] }.to_json,
|
73
|
+
f['foo'][:facet_filter].to_json )
|
52
74
|
end
|
53
75
|
|
54
76
|
end
|
@@ -64,8 +86,8 @@ module Tire::Search
|
|
64
86
|
end
|
65
87
|
|
66
88
|
should "encode custom options" do
|
67
|
-
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false,:exclude=>['moo']} } }.to_json,
|
68
|
-
Facet.new('foo').terms(:bar, :size => 5, :exclude => ['moo']).to_json )
|
89
|
+
assert_equal( MultiJson.load({ :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false,:exclude=>['moo']} } }.to_json),
|
90
|
+
MultiJson.load(Facet.new('foo').terms(:bar, :size => 5, :exclude => ['moo']).to_json) )
|
69
91
|
end
|
70
92
|
|
71
93
|
end
|
@@ -138,12 +160,14 @@ module Tire::Search
|
|
138
160
|
end
|
139
161
|
|
140
162
|
context "filter facet" do
|
163
|
+
|
141
164
|
should "encode facet options" do
|
142
165
|
f = Facet.new('filter_facet') do
|
143
|
-
filter :
|
166
|
+
filter :term, :tags => 'ruby'
|
144
167
|
end
|
145
168
|
assert_equal({ :filter_facet => { :filter => { :term => { :tags => 'ruby' } } } }.to_json, f.to_json)
|
146
169
|
end
|
170
|
+
|
147
171
|
end
|
148
172
|
|
149
173
|
end
|
@@ -19,6 +19,10 @@ module Tire::Search
|
|
19
19
|
term(:foo, 'bar')
|
20
20
|
end.to_json)
|
21
21
|
end
|
22
|
+
|
23
|
+
should "have accessor for value" do
|
24
|
+
assert_equal( {}, Query.new.value )
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
context "Term query" do
|
@@ -29,6 +33,17 @@ module Tire::Search
|
|
29
33
|
should "allow search for single term passing an options hash" do
|
30
34
|
assert_equal( { :term => { :foo => { :term => 'bar', :boost => 2.0 } } }, Query.new.term(:foo, 'bar', :boost => 2.0) )
|
31
35
|
end
|
36
|
+
|
37
|
+
should "allow complex term queries" do
|
38
|
+
assert_equal( { :term => { :foo => { :field => 'bar', :boost => 2.0 } } }, Query.new.term(:foo, {:field => 'bar', :boost => 2.0}) )
|
39
|
+
end
|
40
|
+
|
41
|
+
should "allow complex term queries with Hash-like objects" do
|
42
|
+
assert_equal(
|
43
|
+
{ :term => { :foo => { :field => 'bar', :boost => 2.0 } } },
|
44
|
+
Query.new.term(:foo, Hashr.new( :field => 'bar', :boost => 2.0 ))
|
45
|
+
)
|
46
|
+
end
|
32
47
|
end
|
33
48
|
|
34
49
|
context "Terms query" do
|
@@ -105,6 +120,10 @@ module Tire::Search
|
|
105
120
|
should "search for all documents" do
|
106
121
|
assert_equal( { :match_all => { } }, Query.new.all )
|
107
122
|
end
|
123
|
+
|
124
|
+
should "allow passing arguments" do
|
125
|
+
assert_equal( { :match_all => {:boost => 1.2} }, Query.new.all(:boost => 1.2) )
|
126
|
+
end
|
108
127
|
end
|
109
128
|
|
110
129
|
context "IDs query" do
|
@@ -297,5 +316,82 @@ module Tire::Search
|
|
297
316
|
|
298
317
|
end
|
299
318
|
|
319
|
+
context "BoostingQuery" do
|
320
|
+
|
321
|
+
should "not raise an error when no block is given" do
|
322
|
+
assert_nothing_raised { Query.new.boosting }
|
323
|
+
end
|
324
|
+
|
325
|
+
should "encode options" do
|
326
|
+
query = Query.new.boosting(:negative_boost => 0.2) do
|
327
|
+
positive { string 'foo' }
|
328
|
+
end
|
329
|
+
|
330
|
+
assert_equal 0.2, query[:boosting][:negative_boost]
|
331
|
+
end
|
332
|
+
|
333
|
+
should "wrap positive query" do
|
334
|
+
assert_equal( { :boosting => {:positive => [{ :query_string => { :query => 'foo' } }] }},
|
335
|
+
Query.new.boosting { positive { string 'foo' } } )
|
336
|
+
end
|
337
|
+
|
338
|
+
should "wrap negative query" do
|
339
|
+
assert_equal( { :boosting => {:negative => [{ :query_string => { :query => 'foo' } }] }},
|
340
|
+
Query.new.boosting { negative { string 'foo' } } )
|
341
|
+
end
|
342
|
+
|
343
|
+
should "wrap multiple queries for the same condition" do
|
344
|
+
query = Query.new.boosting do
|
345
|
+
positive { string 'foo' }
|
346
|
+
positive { term('bar', 'baz') }
|
347
|
+
end
|
348
|
+
|
349
|
+
assert_equal( 2, query[:boosting][:positive].size, query[:boosting][:positive].inspect )
|
350
|
+
assert_equal( { :query_string => {:query => 'foo'} }, query[:boosting][:positive].first )
|
351
|
+
assert_equal( { :term => { "bar" => { :term => "baz" } } }, query[:boosting][:positive].last )
|
352
|
+
end
|
353
|
+
|
354
|
+
should "allow passing variables from outer scope" do
|
355
|
+
@q1 = 'foo'
|
356
|
+
@q2 = 'bar'
|
357
|
+
query = Query.new.boosting do |boosting|
|
358
|
+
boosting.positive { |query| query.string @q1 }
|
359
|
+
boosting.negative { |query| query.string @q2 }
|
360
|
+
end
|
361
|
+
|
362
|
+
assert_equal( { :query_string => {:query => 'foo'} }, query[:boosting][:positive].first )
|
363
|
+
assert_equal( { :query_string => {:query => 'bar'} }, query[:boosting][:negative].last )
|
364
|
+
end
|
365
|
+
|
366
|
+
end
|
367
|
+
|
368
|
+
context "MatchQuery" do
|
369
|
+
|
370
|
+
should "allow searching in single field" do
|
371
|
+
assert_equal( { :match => { :foo => { :query => 'bar' } } },
|
372
|
+
Query.new.match(:foo, 'bar') )
|
373
|
+
end
|
374
|
+
|
375
|
+
should "allow searching in multiple fields with multi_match" do
|
376
|
+
assert_equal( { :multi_match => { :query => 'bar', :fields => [:foo, :moo] } },
|
377
|
+
Query.new.match([:foo, :moo], 'bar') )
|
378
|
+
end
|
379
|
+
|
380
|
+
should "encode options" do
|
381
|
+
query = Query.new.match(:foo, 'bar', :type => 'phrase_prefix')
|
382
|
+
assert_equal 'phrase_prefix', query[:match][:foo][:type]
|
383
|
+
end
|
384
|
+
|
385
|
+
should "automatically construct a boolean query" do
|
386
|
+
query = Query.new
|
387
|
+
query.match(:foo, 'bar')
|
388
|
+
query.match(:moo, 'bar')
|
389
|
+
|
390
|
+
assert_not_nil query.to_hash[:bool]
|
391
|
+
assert_equal 2, query.to_hash[:bool][:must].size
|
392
|
+
end
|
393
|
+
|
394
|
+
end
|
395
|
+
|
300
396
|
end
|
301
397
|
end
|
data/test/unit/search_test.rb
CHANGED
@@ -117,9 +117,8 @@ module Tire
|
|
117
117
|
s = Search::Search.new('index') do
|
118
118
|
query { string 'title:foo' }
|
119
119
|
end
|
120
|
-
|
121
|
-
|
122
|
-
s.to_curl
|
120
|
+
assert_match %r|curl \-X GET 'http://localhost:9200/index/_search\?pretty' -d |, s.to_curl
|
121
|
+
assert_match %r|\s*{\s*"query"\s*:\s*"title:foo"\s*}\s*|, s.to_curl
|
123
122
|
end
|
124
123
|
|
125
124
|
should "return curl snippet with multiple indices for debugging" do
|
@@ -233,6 +232,15 @@ module Tire
|
|
233
232
|
assert_equal [{'title' => 'desc'}, '_score'], hash['sort']
|
234
233
|
end
|
235
234
|
|
235
|
+
should "allow to track scores" do
|
236
|
+
s = Search::Search.new('index') do
|
237
|
+
sort { by :title }
|
238
|
+
track_scores true
|
239
|
+
end
|
240
|
+
|
241
|
+
assert_equal 'true', s.to_hash[:track_scores].to_json
|
242
|
+
end
|
243
|
+
|
236
244
|
end
|
237
245
|
|
238
246
|
context "facets" do
|
@@ -395,6 +403,30 @@ module Tire
|
|
395
403
|
|
396
404
|
end
|
397
405
|
|
406
|
+
context "with min_score" do
|
407
|
+
should "allow to specify minimum score for returned documents" do
|
408
|
+
s = Search::Search.new('index') do
|
409
|
+
query { string 'foo' }
|
410
|
+
min_score 0.5
|
411
|
+
end
|
412
|
+
|
413
|
+
assert_equal( '0.5', s.to_hash[:min_score].to_json )
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
417
|
+
context "with partial fields" do
|
418
|
+
|
419
|
+
should "add partial_fields config" do
|
420
|
+
s = Search::Search.new('index') do
|
421
|
+
partial_field 'name', :include => 'name_*'
|
422
|
+
end
|
423
|
+
|
424
|
+
hash = MultiJson.decode( s.to_json )
|
425
|
+
assert_equal({'name' => { 'include' => 'name_*'} }, hash['partial_fields'])
|
426
|
+
end
|
427
|
+
|
428
|
+
end
|
429
|
+
|
398
430
|
context "explain" do
|
399
431
|
|
400
432
|
should "default to false" do
|
@@ -458,6 +490,31 @@ module Tire
|
|
458
490
|
|
459
491
|
end
|
460
492
|
|
493
|
+
context "boosting queries" do
|
494
|
+
|
495
|
+
should "wrap other queries" do
|
496
|
+
s = Search::Search.new('index') do
|
497
|
+
query do
|
498
|
+
boosting do
|
499
|
+
positive { string 'foo' }
|
500
|
+
positive { term('bar', 'baz') }
|
501
|
+
negative { term('bar', 'moo') }
|
502
|
+
end
|
503
|
+
end
|
504
|
+
end
|
505
|
+
|
506
|
+
hash = MultiJson.decode(s.to_json)
|
507
|
+
query = hash['query']['boosting']
|
508
|
+
|
509
|
+
assert_equal 2, query['positive'].size
|
510
|
+
assert_equal 1, query['negative'].size
|
511
|
+
|
512
|
+
assert_equal( { 'query_string' => { 'query' => 'foo' } }, query['positive'].first)
|
513
|
+
assert_equal( { 'term' => { 'bar' => {'term' => 'moo' } } }, query['negative'].first)
|
514
|
+
end
|
515
|
+
|
516
|
+
end
|
517
|
+
|
461
518
|
end
|
462
519
|
|
463
520
|
context "script field" do
|
data/test/unit/tire_test.rb
CHANGED
@@ -49,6 +49,19 @@ module Tire
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
should "allow to perform multiple searches" do
|
53
|
+
Tire::Search::Multi::Search.expects(:new).returns( stub(:perform => true) )
|
54
|
+
|
55
|
+
Tire.multi_search 'dummy' do
|
56
|
+
search 'foo'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
should "allow to call multi_search" do
|
61
|
+
assert_respond_to Tire, :multi_search
|
62
|
+
assert_respond_to Tire, :msearch
|
63
|
+
end
|
64
|
+
|
52
65
|
context "when retrieving results" do
|
53
66
|
|
54
67
|
should "not call the #perform method immediately" do
|
@@ -119,6 +132,7 @@ module Tire
|
|
119
132
|
end
|
120
133
|
|
121
134
|
end
|
135
|
+
|
122
136
|
end
|
123
137
|
|
124
138
|
end
|
data/tire.gemspec
CHANGED
@@ -31,7 +31,6 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.add_dependency "multi_json", "~> 1.0"
|
32
32
|
s.add_dependency "activemodel", ">= 3.0"
|
33
33
|
s.add_dependency "hashr", "~> 0.0.19"
|
34
|
-
s.add_dependency "rack", ">= 1.4" if defined?(RUBY_VERSION) && RUBY_VERSION < '1.9'
|
35
34
|
|
36
35
|
# = Development dependencies
|
37
36
|
#
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70223214921740 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70223214921740
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rest-client
|
27
|
-
requirement: &
|
27
|
+
requirement: &70223214920520 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '1.6'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70223214920520
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: multi_json
|
38
|
-
requirement: &
|
38
|
+
requirement: &70223214919080 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '1.0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70223214919080
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: activemodel
|
49
|
-
requirement: &
|
49
|
+
requirement: &70223214918580 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '3.0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70223214918580
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: hashr
|
60
|
-
requirement: &
|
60
|
+
requirement: &70223214917880 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 0.0.19
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70223214917880
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bundler
|
71
|
-
requirement: &
|
71
|
+
requirement: &70223214917060 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '1.0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70223214917060
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: yajl-ruby
|
82
|
-
requirement: &
|
82
|
+
requirement: &70223214915540 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '1.0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70223214915540
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: shoulda
|
93
|
-
requirement: &
|
93
|
+
requirement: &70223214914780 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70223214914780
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: mocha
|
104
|
-
requirement: &
|
104
|
+
requirement: &70223214930040 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70223214930040
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: activerecord
|
115
|
-
requirement: &
|
115
|
+
requirement: &70223214928700 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '3.0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *70223214928700
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: sqlite3
|
126
|
-
requirement: &
|
126
|
+
requirement: &70223214927400 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *70223214927400
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: mongoid
|
137
|
-
requirement: &
|
137
|
+
requirement: &70223214926580 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ~>
|
@@ -142,10 +142,10 @@ dependencies:
|
|
142
142
|
version: '2.2'
|
143
143
|
type: :development
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *70223214926580
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: bson_ext
|
148
|
-
requirement: &
|
148
|
+
requirement: &70223214925540 !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
151
151
|
- - ! '>='
|
@@ -153,10 +153,10 @@ dependencies:
|
|
153
153
|
version: '0'
|
154
154
|
type: :development
|
155
155
|
prerelease: false
|
156
|
-
version_requirements: *
|
156
|
+
version_requirements: *70223214925540
|
157
157
|
- !ruby/object:Gem::Dependency
|
158
158
|
name: redis-persistence
|
159
|
-
requirement: &
|
159
|
+
requirement: &70223214924920 !ruby/object:Gem::Requirement
|
160
160
|
none: false
|
161
161
|
requirements:
|
162
162
|
- - ! '>='
|
@@ -164,10 +164,10 @@ dependencies:
|
|
164
164
|
version: '0'
|
165
165
|
type: :development
|
166
166
|
prerelease: false
|
167
|
-
version_requirements: *
|
167
|
+
version_requirements: *70223214924920
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
169
|
name: curb
|
170
|
-
requirement: &
|
170
|
+
requirement: &70223214923980 !ruby/object:Gem::Requirement
|
171
171
|
none: false
|
172
172
|
requirements:
|
173
173
|
- - ! '>='
|
@@ -175,10 +175,10 @@ dependencies:
|
|
175
175
|
version: '0'
|
176
176
|
type: :development
|
177
177
|
prerelease: false
|
178
|
-
version_requirements: *
|
178
|
+
version_requirements: *70223214923980
|
179
179
|
- !ruby/object:Gem::Dependency
|
180
180
|
name: minitest
|
181
|
-
requirement: &
|
181
|
+
requirement: &70223214923120 !ruby/object:Gem::Requirement
|
182
182
|
none: false
|
183
183
|
requirements:
|
184
184
|
- - ! '>='
|
@@ -186,10 +186,10 @@ dependencies:
|
|
186
186
|
version: '0'
|
187
187
|
type: :development
|
188
188
|
prerelease: false
|
189
|
-
version_requirements: *
|
189
|
+
version_requirements: *70223214923120
|
190
190
|
- !ruby/object:Gem::Dependency
|
191
191
|
name: turn
|
192
|
-
requirement: &
|
192
|
+
requirement: &70223214922420 !ruby/object:Gem::Requirement
|
193
193
|
none: false
|
194
194
|
requirements:
|
195
195
|
- - ~>
|
@@ -197,10 +197,10 @@ dependencies:
|
|
197
197
|
version: '0.9'
|
198
198
|
type: :development
|
199
199
|
prerelease: false
|
200
|
-
version_requirements: *
|
200
|
+
version_requirements: *70223214922420
|
201
201
|
- !ruby/object:Gem::Dependency
|
202
202
|
name: rdoc
|
203
|
-
requirement: &
|
203
|
+
requirement: &70223215704680 !ruby/object:Gem::Requirement
|
204
204
|
none: false
|
205
205
|
requirements:
|
206
206
|
- - ! '>='
|
@@ -208,7 +208,7 @@ dependencies:
|
|
208
208
|
version: '0'
|
209
209
|
type: :development
|
210
210
|
prerelease: false
|
211
|
-
version_requirements: *
|
211
|
+
version_requirements: *70223215704680
|
212
212
|
description: ! " Tire is a Ruby client for the ElasticSearch search engine/database.\n\n
|
213
213
|
\ It provides Ruby-like API for fluent communication with the ElasticSearch server\n
|
214
214
|
\ and blends with ActiveModel class for convenient usage in Rails applications.\n\n
|
@@ -226,6 +226,7 @@ extra_rdoc_files:
|
|
226
226
|
files:
|
227
227
|
- .gitignore
|
228
228
|
- .travis.yml
|
229
|
+
- .yardopts
|
229
230
|
- Gemfile
|
230
231
|
- MIT-LICENSE
|
231
232
|
- README.markdown
|
@@ -252,16 +253,19 @@ files:
|
|
252
253
|
- lib/tire/model/persistence/finders.rb
|
253
254
|
- lib/tire/model/persistence/storage.rb
|
254
255
|
- lib/tire/model/search.rb
|
256
|
+
- lib/tire/multi_search.rb
|
255
257
|
- lib/tire/results/collection.rb
|
256
258
|
- lib/tire/results/item.rb
|
257
259
|
- lib/tire/results/pagination.rb
|
258
260
|
- lib/tire/rubyext/hash.rb
|
259
261
|
- lib/tire/rubyext/ruby_1_8.rb
|
260
262
|
- lib/tire/rubyext/symbol.rb
|
263
|
+
- lib/tire/rubyext/uri_escape.rb
|
261
264
|
- lib/tire/search.rb
|
262
265
|
- lib/tire/search/facet.rb
|
263
266
|
- lib/tire/search/filter.rb
|
264
267
|
- lib/tire/search/highlight.rb
|
268
|
+
- lib/tire/search/queries/match.rb
|
265
269
|
- lib/tire/search/query.rb
|
266
270
|
- lib/tire/search/scan.rb
|
267
271
|
- lib/tire/search/script_field.rb
|
@@ -278,6 +282,7 @@ files:
|
|
278
282
|
- test/integration/active_model_searchable_test.rb
|
279
283
|
- test/integration/active_record_searchable_test.rb
|
280
284
|
- test/integration/boolean_queries_test.rb
|
285
|
+
- test/integration/boosting_queries_test.rb
|
281
286
|
- test/integration/count_test.rb
|
282
287
|
- test/integration/custom_score_queries_test.rb
|
283
288
|
- test/integration/dis_max_queries_test.rb
|
@@ -292,7 +297,9 @@ files:
|
|
292
297
|
- test/integration/index_mapping_test.rb
|
293
298
|
- test/integration/index_store_test.rb
|
294
299
|
- test/integration/index_update_document_test.rb
|
300
|
+
- test/integration/match_query_test.rb
|
295
301
|
- test/integration/mongoid_searchable_test.rb
|
302
|
+
- test/integration/multi_search_test.rb
|
296
303
|
- test/integration/percolator_test.rb
|
297
304
|
- test/integration/persistent_model_test.rb
|
298
305
|
- test/integration/prefix_query_test.rb
|
@@ -313,6 +320,7 @@ files:
|
|
313
320
|
- test/models/article.rb
|
314
321
|
- test/models/mongoid_models.rb
|
315
322
|
- test/models/persistent_article.rb
|
323
|
+
- test/models/persistent_article_in_index.rb
|
316
324
|
- test/models/persistent_article_in_namespace.rb
|
317
325
|
- test/models/persistent_article_with_casting.rb
|
318
326
|
- test/models/persistent_article_with_defaults.rb
|
@@ -329,8 +337,10 @@ files:
|
|
329
337
|
- test/unit/logger_test.rb
|
330
338
|
- test/unit/model_callbacks_test.rb
|
331
339
|
- test/unit/model_import_test.rb
|
340
|
+
- test/unit/model_initialization_test.rb
|
332
341
|
- test/unit/model_persistence_test.rb
|
333
342
|
- test/unit/model_search_test.rb
|
343
|
+
- test/unit/multi_search_test.rb
|
334
344
|
- test/unit/results_collection_test.rb
|
335
345
|
- test/unit/results_item_test.rb
|
336
346
|
- test/unit/rubyext_test.rb
|
@@ -348,12 +358,27 @@ homepage: http://github.com/karmi/tire
|
|
348
358
|
licenses: []
|
349
359
|
post_install_message: ! "================================================================================\n\n
|
350
360
|
\ Please check the documentation at <http://karmi.github.com/tire/>.\n\n--------------------------------------------------------------------------------\n\n
|
351
|
-
\ IMPORTANT CHANGES LATELY:\n\n *
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
361
|
+
\ IMPORTANT CHANGES LATELY:\n\n * [!BREAKING!] Change format of sort/order in simple
|
362
|
+
model searches to <field>:<direction>\n * [FIX] Remove `page` and `per_page` from
|
363
|
+
parameters sent to elasticsearch\n * [FIX] Remove the `wrapper` options from URL
|
364
|
+
params sent to elasticsearch\n * [FIX] Use `options.delete(:sort)` in model search
|
365
|
+
to halt bubbling of `sort` into URL parameters [#334]\n * Added prettified JSON
|
366
|
+
output for logging requests and responses at the `debug` level\n * Improved the
|
367
|
+
Rake import task\n * Allow passing of arbitrary objects in the `:as` mapping option
|
368
|
+
[#446]\n * Allow to define default values for Tire::Model::Persistence `:as` lambdas\n
|
369
|
+
\ * Added `@search.results.max_score`\n * Changed the URI escape/unescape compatibility
|
370
|
+
patch to not require Rack\n * Allow using the full DSL in filter facets\n * Allow
|
371
|
+
complex hash options for the `term` query\n * Allow passing Hash-like objects to
|
372
|
+
`terms` query as well\n * Implemented `respond_to?` for `Item`\n * Improved support
|
373
|
+
for Kaminari pagination\n * Added support for the `parent` URL parameter in `Index#store`\n
|
374
|
+
\ * Added the `min_score` and `track_scores` DSL methods\n * Added support for
|
375
|
+
loading partial fields\n * Added support for boosting query\n * Added the `facet_filter`
|
376
|
+
DSL method\n * Allow passing `routing`, `fields` and `preference` URL parameter
|
377
|
+
to Index#retrieve\n * Allow building the search request step-by-step in Tire's
|
378
|
+
DSL [#496]\n * Added a `match` query type\n * Added support for multisearch (_msearch)
|
379
|
+
and the `Tire.multi_search` DSL method\n * Added support for multi-search in the
|
380
|
+
ActiveModel integration and in Tire::Model::Persistence\n\n See the full changelog
|
381
|
+
at <http://github.com/karmi/tire/commits/v0.5.0>.\n\n--------------------------------------------------------------------------------\n"
|
357
382
|
rdoc_options:
|
358
383
|
- --charset=UTF-8
|
359
384
|
require_paths:
|
@@ -386,6 +411,7 @@ test_files:
|
|
386
411
|
- test/integration/active_model_searchable_test.rb
|
387
412
|
- test/integration/active_record_searchable_test.rb
|
388
413
|
- test/integration/boolean_queries_test.rb
|
414
|
+
- test/integration/boosting_queries_test.rb
|
389
415
|
- test/integration/count_test.rb
|
390
416
|
- test/integration/custom_score_queries_test.rb
|
391
417
|
- test/integration/dis_max_queries_test.rb
|
@@ -400,7 +426,9 @@ test_files:
|
|
400
426
|
- test/integration/index_mapping_test.rb
|
401
427
|
- test/integration/index_store_test.rb
|
402
428
|
- test/integration/index_update_document_test.rb
|
429
|
+
- test/integration/match_query_test.rb
|
403
430
|
- test/integration/mongoid_searchable_test.rb
|
431
|
+
- test/integration/multi_search_test.rb
|
404
432
|
- test/integration/percolator_test.rb
|
405
433
|
- test/integration/persistent_model_test.rb
|
406
434
|
- test/integration/prefix_query_test.rb
|
@@ -421,6 +449,7 @@ test_files:
|
|
421
449
|
- test/models/article.rb
|
422
450
|
- test/models/mongoid_models.rb
|
423
451
|
- test/models/persistent_article.rb
|
452
|
+
- test/models/persistent_article_in_index.rb
|
424
453
|
- test/models/persistent_article_in_namespace.rb
|
425
454
|
- test/models/persistent_article_with_casting.rb
|
426
455
|
- test/models/persistent_article_with_defaults.rb
|
@@ -437,8 +466,10 @@ test_files:
|
|
437
466
|
- test/unit/logger_test.rb
|
438
467
|
- test/unit/model_callbacks_test.rb
|
439
468
|
- test/unit/model_import_test.rb
|
469
|
+
- test/unit/model_initialization_test.rb
|
440
470
|
- test/unit/model_persistence_test.rb
|
441
471
|
- test/unit/model_search_test.rb
|
472
|
+
- test/unit/multi_search_test.rb
|
442
473
|
- test/unit/results_collection_test.rb
|
443
474
|
- test/unit/results_item_test.rb
|
444
475
|
- test/unit/rubyext_test.rb
|