tire 0.1.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 +9 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +435 -0
- data/Rakefile +75 -0
- data/examples/dsl.rb +73 -0
- data/examples/rails-application-template.rb +144 -0
- data/examples/tire-dsl.rb +617 -0
- data/lib/tire.rb +35 -0
- data/lib/tire/client.rb +40 -0
- data/lib/tire/configuration.rb +29 -0
- data/lib/tire/dsl.rb +33 -0
- data/lib/tire/index.rb +209 -0
- data/lib/tire/logger.rb +60 -0
- data/lib/tire/model/callbacks.rb +23 -0
- data/lib/tire/model/import.rb +18 -0
- data/lib/tire/model/indexing.rb +50 -0
- data/lib/tire/model/naming.rb +30 -0
- data/lib/tire/model/persistence.rb +34 -0
- data/lib/tire/model/persistence/attributes.rb +60 -0
- data/lib/tire/model/persistence/finders.rb +61 -0
- data/lib/tire/model/persistence/storage.rb +75 -0
- data/lib/tire/model/search.rb +97 -0
- data/lib/tire/results/collection.rb +56 -0
- data/lib/tire/results/item.rb +39 -0
- data/lib/tire/results/pagination.rb +30 -0
- data/lib/tire/rubyext/hash.rb +3 -0
- data/lib/tire/rubyext/symbol.rb +11 -0
- data/lib/tire/search.rb +117 -0
- data/lib/tire/search/facet.rb +41 -0
- data/lib/tire/search/filter.rb +28 -0
- data/lib/tire/search/highlight.rb +37 -0
- data/lib/tire/search/query.rb +42 -0
- data/lib/tire/search/sort.rb +29 -0
- data/lib/tire/tasks.rb +88 -0
- data/lib/tire/version.rb +3 -0
- data/test/fixtures/articles/1.json +1 -0
- data/test/fixtures/articles/2.json +1 -0
- data/test/fixtures/articles/3.json +1 -0
- data/test/fixtures/articles/4.json +1 -0
- data/test/fixtures/articles/5.json +1 -0
- data/test/integration/active_model_searchable_test.rb +80 -0
- data/test/integration/active_record_searchable_test.rb +193 -0
- data/test/integration/facets_test.rb +65 -0
- data/test/integration/filters_test.rb +46 -0
- data/test/integration/highlight_test.rb +52 -0
- data/test/integration/index_mapping_test.rb +44 -0
- data/test/integration/index_store_test.rb +68 -0
- data/test/integration/persistent_model_test.rb +35 -0
- data/test/integration/query_string_test.rb +43 -0
- data/test/integration/results_test.rb +28 -0
- data/test/integration/sort_test.rb +36 -0
- data/test/models/active_model_article.rb +31 -0
- data/test/models/active_model_article_with_callbacks.rb +49 -0
- data/test/models/active_model_article_with_custom_index_name.rb +5 -0
- data/test/models/active_record_article.rb +12 -0
- data/test/models/article.rb +15 -0
- data/test/models/persistent_article.rb +11 -0
- data/test/models/persistent_articles_with_custom_index_name.rb +10 -0
- data/test/models/supermodel_article.rb +22 -0
- data/test/models/validated_model.rb +11 -0
- data/test/test_helper.rb +52 -0
- data/test/unit/active_model_lint_test.rb +17 -0
- data/test/unit/client_test.rb +43 -0
- data/test/unit/configuration_test.rb +71 -0
- data/test/unit/index_test.rb +390 -0
- data/test/unit/logger_test.rb +114 -0
- data/test/unit/model_callbacks_test.rb +90 -0
- data/test/unit/model_import_test.rb +71 -0
- data/test/unit/model_persistence_test.rb +400 -0
- data/test/unit/model_search_test.rb +289 -0
- data/test/unit/results_collection_test.rb +131 -0
- data/test/unit/results_item_test.rb +59 -0
- data/test/unit/rubyext_hash_test.rb +19 -0
- data/test/unit/search_facet_test.rb +69 -0
- data/test/unit/search_filter_test.rb +36 -0
- data/test/unit/search_highlight_test.rb +46 -0
- data/test/unit/search_query_test.rb +55 -0
- data/test/unit/search_sort_test.rb +50 -0
- data/test/unit/search_test.rb +204 -0
- data/test/unit/tire_test.rb +55 -0
- data/tire.gemspec +54 -0
- metadata +372 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class RubyCoreExtensionsTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Hash" do
|
8
|
+
|
9
|
+
should "have to_indexed_json doing the same as to_json" do
|
10
|
+
[{}, { 1 => 2 }, { 3 => 4, 5 => 6 }, { nil => [7,8,9] }].each do |h|
|
11
|
+
assert_equal Yajl::Parser.parse(h.to_json), Yajl::Parser.parse(h.to_indexed_json)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire::Search
|
4
|
+
|
5
|
+
class FacetTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Facet" do
|
8
|
+
|
9
|
+
should "be serialized to JSON" do
|
10
|
+
assert_respond_to Facet.new('foo'), :to_json
|
11
|
+
end
|
12
|
+
|
13
|
+
context "generally" do
|
14
|
+
|
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 )
|
18
|
+
end
|
19
|
+
|
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 )
|
23
|
+
end
|
24
|
+
|
25
|
+
should "encode facet options" do
|
26
|
+
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>5,:all_terms=>false} } }.to_json,
|
27
|
+
Facet.new('foo').terms(:bar, :size => 5).to_json )
|
28
|
+
end
|
29
|
+
|
30
|
+
should "encode facets when passed as a block" do
|
31
|
+
f = Facet.new('foo') do
|
32
|
+
terms :bar
|
33
|
+
end
|
34
|
+
assert_equal( { :foo => { :terms => {:field=>'bar',:size=>10,:all_terms=>false} } }.to_json, f.to_json )
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
context "terms facet" do
|
40
|
+
|
41
|
+
should "encode the default all_terms option" do
|
42
|
+
assert_equal false, Facet.new('foo') { terms :foo }.to_hash['foo'][:terms][:all_terms]
|
43
|
+
end
|
44
|
+
|
45
|
+
should "encode the all_terms option" do
|
46
|
+
assert_equal true, Facet.new('foo') { terms :foo, :all_terms => true }.to_hash['foo'][:terms][:all_terms]
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
context "date histogram" do
|
52
|
+
|
53
|
+
should "encode the JSON with default values" do
|
54
|
+
f = Facet.new('date') { date :published_on, :interval => 'day' }
|
55
|
+
assert_equal({ :date => { :date_histogram => { :field => 'published_on', :interval => 'day' } } }.to_json, f.to_json)
|
56
|
+
end
|
57
|
+
|
58
|
+
should "encode the JSON with custom interval" do
|
59
|
+
f = Facet.new('date') { date :published_on, :interval => 'month' }
|
60
|
+
assert_equal({ :date => { :date_histogram => { :field => 'published_on', :interval => 'month' } } }.to_json, f.to_json)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire::Search
|
4
|
+
|
5
|
+
class FilterTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Filter" do
|
8
|
+
|
9
|
+
should "be serialized to JSON" do
|
10
|
+
assert_respond_to Filter.new(:terms, {}), :to_json
|
11
|
+
end
|
12
|
+
|
13
|
+
should "encode simple filter declarations as JSON" do
|
14
|
+
assert_equal( { :terms => {} }.to_json,
|
15
|
+
Filter.new('terms').to_json )
|
16
|
+
|
17
|
+
assert_equal( { :terms => { :tags => ['foo'] } }.to_json,
|
18
|
+
Filter.new('terms', :tags => ['foo']).to_json )
|
19
|
+
|
20
|
+
assert_equal( { :range => { :age => { :from => 10, :to => 20 } } }.to_json,
|
21
|
+
Filter.new('range', { :age => { :from => 10, :to => 20 } }).to_json )
|
22
|
+
|
23
|
+
assert_equal( { :geo_distance => { :distance => '12km', :location => [40, -70] } }.to_json,
|
24
|
+
Filter.new('geo_distance', { :distance => '12km', :location => [40, -70] }).to_json )
|
25
|
+
end
|
26
|
+
|
27
|
+
should "encode 'or' filter declarations as JSON" do
|
28
|
+
# See http://www.elasticsearch.org/guide/reference/query-dsl/or-filter.html
|
29
|
+
assert_equal( { :or => [ {:terms => {:tags => ['foo']}}, {:terms => {:tags => ['bar']}} ] }.to_json,
|
30
|
+
Filter.new('or', {:terms => {:tags => ['foo']}}, {:terms => {:tags => ['bar']}}).to_json )
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire::Search
|
4
|
+
|
5
|
+
class HighlightTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Highlight" do
|
8
|
+
|
9
|
+
should "be serialized to JSON" do
|
10
|
+
assert_respond_to Highlight.new(:body), :to_json
|
11
|
+
end
|
12
|
+
|
13
|
+
should "specify highlight for single field" do
|
14
|
+
assert_equal( {:fields => { :body => {} }}.to_json,
|
15
|
+
Highlight.new(:body).to_json )
|
16
|
+
end
|
17
|
+
|
18
|
+
should "specify highlight for more fields" do
|
19
|
+
assert_equal( {:fields => { :title => {}, :body => {} }}.to_json,
|
20
|
+
Highlight.new(:title, :body).to_json )
|
21
|
+
end
|
22
|
+
|
23
|
+
should "specify highlight for more fields with options" do
|
24
|
+
assert_equal( {:fields => { :title => {}, :body => { :a => 1, :b => 2 } }}.to_json,
|
25
|
+
Highlight.new(:title, :body => { :a => 1, :b => 2 }).to_json )
|
26
|
+
end
|
27
|
+
|
28
|
+
should "specify highlight for more fields with highlight options" do
|
29
|
+
# p Highlight.new(:title, :body => {}, :options => { :tag => '<strong>' }).to_hash
|
30
|
+
assert_equal( {:fields => { :title => {}, :body => {} }, :pre_tags => ['<strong>'], :post_tags => ['</strong>'] }.to_json,
|
31
|
+
Highlight.new(:title, :body => {}, :options => { :tag => '<strong>' }).to_json )
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with custom tags" do
|
35
|
+
|
36
|
+
should "properly parse tags with class" do
|
37
|
+
assert_equal( {:fields => { :title => {} }, :pre_tags => ['<strong class="highlight">'], :post_tags => ['</strong>'] }.to_json,
|
38
|
+
Highlight.new(:title, :options => { :tag => '<strong class="highlight">' }).to_json )
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire::Search
|
4
|
+
|
5
|
+
class QueryTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Query" do
|
8
|
+
|
9
|
+
should "be serialized to JSON" do
|
10
|
+
assert_respond_to Query.new, :to_json
|
11
|
+
end
|
12
|
+
|
13
|
+
should "allow a block to be given" do
|
14
|
+
assert_equal( { :term => { :foo => 'bar' } }.to_json, Query.new do
|
15
|
+
term(:foo, 'bar')
|
16
|
+
end.to_json)
|
17
|
+
end
|
18
|
+
|
19
|
+
should "allow search for single term" do
|
20
|
+
assert_equal( { :term => { :foo => 'bar' } }, Query.new.term(:foo, 'bar') )
|
21
|
+
end
|
22
|
+
|
23
|
+
should "allow search for multiple terms" do
|
24
|
+
assert_equal( { :terms => { :foo => ['bar', 'baz'] } }, Query.new.terms(:foo, ['bar', 'baz']) )
|
25
|
+
end
|
26
|
+
|
27
|
+
should "allow set minimum match when searching for multiple terms" do
|
28
|
+
assert_equal( { :terms => { :foo => ['bar', 'baz'], :minimum_match => 2 } },
|
29
|
+
Query.new.terms(:foo, ['bar', 'baz'], :minimum_match => 2) )
|
30
|
+
end
|
31
|
+
|
32
|
+
should "allow search with a query string" do
|
33
|
+
assert_equal( { :query_string => { :query => 'title:foo' } },
|
34
|
+
Query.new.string('title:foo') )
|
35
|
+
end
|
36
|
+
|
37
|
+
should "allow set default field when searching with a query string" do
|
38
|
+
assert_equal( { :query_string => { :query => 'foo', :default_field => 'title' } },
|
39
|
+
Query.new.string('foo', :default_field => 'title') )
|
40
|
+
end
|
41
|
+
|
42
|
+
should "search for all documents" do
|
43
|
+
assert_equal( { :match_all => { } }, Query.new.all )
|
44
|
+
end
|
45
|
+
|
46
|
+
should "search for documents by IDs" do
|
47
|
+
assert_equal( { :ids => { :values => [1, 2], :type => 'foo' } },
|
48
|
+
Query.new.ids([1, 2], 'foo') )
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire::Search
|
4
|
+
|
5
|
+
class SortTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Sort" do
|
8
|
+
|
9
|
+
should "be serialized to JSON" do
|
10
|
+
assert_respond_to Sort.new, :to_json
|
11
|
+
end
|
12
|
+
|
13
|
+
should "encode simple strings" do
|
14
|
+
assert_equal [:foo].to_json, Sort.new.foo.to_json
|
15
|
+
end
|
16
|
+
|
17
|
+
should "encode method arguments" do
|
18
|
+
assert_equal [:foo => 'desc'].to_json, Sort.new.foo('desc').to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
should "encode hash" do
|
22
|
+
assert_equal [ :foo => { :reverse => true } ].to_json, Sort.new.foo(:reverse => true).to_json
|
23
|
+
end
|
24
|
+
|
25
|
+
should "encode multiple sort fields" do
|
26
|
+
assert_equal [:foo, :bar].to_json, Sort.new.foo.bar.to_json
|
27
|
+
end
|
28
|
+
|
29
|
+
should "encode fields when passed as a block to constructor" do
|
30
|
+
s = Sort.new do
|
31
|
+
foo
|
32
|
+
bar 'desc'
|
33
|
+
_score
|
34
|
+
end
|
35
|
+
assert_equal [ :foo, {:bar => 'desc'}, :_score ].to_json, s.to_json
|
36
|
+
end
|
37
|
+
|
38
|
+
should "encode fields deeper in json" do
|
39
|
+
s = Sort.new { field 'author.name' }
|
40
|
+
assert_equal [ 'author.name' ].to_json, s.to_json
|
41
|
+
|
42
|
+
s = Sort.new { field 'author.name', :desc }
|
43
|
+
assert_equal [ {'author.name' => 'desc'} ].to_json, s.to_json
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class SearchTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Search" do
|
8
|
+
setup { Configuration.reset :logger }
|
9
|
+
|
10
|
+
should "be initialized with index/indices" do
|
11
|
+
assert_raise(ArgumentError) { Search::Search.new }
|
12
|
+
end
|
13
|
+
|
14
|
+
should "have the query method" do
|
15
|
+
assert_respond_to Search::Search.new('index'), :query
|
16
|
+
end
|
17
|
+
|
18
|
+
should "allow to pass block to query" do
|
19
|
+
Search::Query.any_instance.expects(:instance_eval)
|
20
|
+
|
21
|
+
Search::Search.new('index').query { string 'foo' }
|
22
|
+
end
|
23
|
+
|
24
|
+
should "allow to pass block with argument to query, allowing to use local variables from outer scope" do
|
25
|
+
foo = 'bar'
|
26
|
+
query_block = lambda { |query| query.string foo }
|
27
|
+
Search::Query.any_instance.expects(:instance_eval).never
|
28
|
+
|
29
|
+
Search::Search.new('index').query &query_block
|
30
|
+
end
|
31
|
+
|
32
|
+
should "store indices as an array" do
|
33
|
+
s = Search::Search.new('index1') do;end
|
34
|
+
assert_equal ['index1'], s.indices
|
35
|
+
|
36
|
+
s = Search::Search.new('index1', 'index2') do;end
|
37
|
+
assert_equal ['index1', 'index2'], s.indices
|
38
|
+
end
|
39
|
+
|
40
|
+
should "return curl snippet for debugging" do
|
41
|
+
s = Search::Search.new('index') do
|
42
|
+
query { string 'title:foo' }
|
43
|
+
end
|
44
|
+
assert_equal %q|curl -X POST "http://localhost:9200/index/_search?pretty=true" -d | +
|
45
|
+
%q|'{"query":{"query_string":{"query":"title:foo"}}}'|,
|
46
|
+
s.to_curl
|
47
|
+
end
|
48
|
+
|
49
|
+
should "return curl snippet with multiple indices for debugging" do
|
50
|
+
s = Search::Search.new('index_1', 'index_2') do
|
51
|
+
query { string 'title:foo' }
|
52
|
+
end
|
53
|
+
assert_match /index_1,index_2/, s.to_curl
|
54
|
+
end
|
55
|
+
|
56
|
+
should "allow chaining" do
|
57
|
+
assert_nothing_raised do
|
58
|
+
Search::Search.new('index').query { }.sort { title 'desc' }.size(5).sort { name 'asc' }.from(1)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
should "perform the search" do
|
63
|
+
response = stub(:body => '{"took":1,"hits":[]}', :code => 200)
|
64
|
+
Configuration.client.expects(:post).returns(response)
|
65
|
+
Results::Collection.expects(:new).returns([])
|
66
|
+
|
67
|
+
s = Search::Search.new('index')
|
68
|
+
s.perform
|
69
|
+
assert_not_nil s.results
|
70
|
+
assert_not_nil s.response
|
71
|
+
end
|
72
|
+
|
73
|
+
should "print debugging information on exception and re-raise it" do
|
74
|
+
Configuration.client.expects(:post).raises(RestClient::InternalServerError)
|
75
|
+
STDERR.expects(:puts)
|
76
|
+
|
77
|
+
s = Search::Search.new('index')
|
78
|
+
assert_raise(RestClient::InternalServerError) { s.perform }
|
79
|
+
end
|
80
|
+
|
81
|
+
should "log request, but not response, when logger is set" do
|
82
|
+
Configuration.logger STDERR
|
83
|
+
|
84
|
+
response = stub(:body => '{"took":1,"hits":[]}', :code => 200)
|
85
|
+
Configuration.client.expects(:post).returns(response)
|
86
|
+
|
87
|
+
Results::Collection.expects(:new).returns([])
|
88
|
+
Configuration.logger.expects(:log_request).returns(true)
|
89
|
+
Configuration.logger.expects(:log_response).with(200, 1, '')
|
90
|
+
|
91
|
+
Search::Search.new('index').perform
|
92
|
+
end
|
93
|
+
|
94
|
+
context "sort" do
|
95
|
+
|
96
|
+
should "allow sorting by multiple fields" do
|
97
|
+
s = Search::Search.new('index') do
|
98
|
+
sort do
|
99
|
+
title 'desc'
|
100
|
+
_score
|
101
|
+
end
|
102
|
+
end
|
103
|
+
hash = JSON.load( s.to_json )
|
104
|
+
assert_equal [{'title' => 'desc'}, '_score'], hash['sort']
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
context "facets" do
|
110
|
+
|
111
|
+
should "retrieve terms facets" do
|
112
|
+
s = Search::Search.new('index') do
|
113
|
+
facet('foo1') { terms :bar, :global => true }
|
114
|
+
facet('foo2', :global => true) { terms :bar }
|
115
|
+
facet('foo3') { terms :baz }
|
116
|
+
end
|
117
|
+
assert_equal 3, s.facets.keys.size
|
118
|
+
assert_not_nil s.facets['foo1']
|
119
|
+
assert_not_nil s.facets['foo2']
|
120
|
+
assert_not_nil s.facets['foo3']
|
121
|
+
end
|
122
|
+
|
123
|
+
should "retrieve date histogram facets" do
|
124
|
+
s = Search::Search.new('index') do
|
125
|
+
facet('date') { date :published_on }
|
126
|
+
end
|
127
|
+
assert_equal 1, s.facets.keys.size
|
128
|
+
assert_not_nil s.facets['date']
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
context "filter" do
|
134
|
+
|
135
|
+
should "allow to specify filter" do
|
136
|
+
s = Search::Search.new('index') do
|
137
|
+
filter :terms, :tags => ['foo']
|
138
|
+
end
|
139
|
+
|
140
|
+
assert_equal 1, s.filters.size
|
141
|
+
assert_not_nil s.filters.first
|
142
|
+
assert_not_nil s.filters.first[:terms]
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
context "highlight" do
|
148
|
+
|
149
|
+
should "allow to specify highlight for single field" do
|
150
|
+
s = Search::Search.new('index') do
|
151
|
+
highlight :body
|
152
|
+
end
|
153
|
+
|
154
|
+
assert_not_nil s.highlight
|
155
|
+
assert_instance_of Tire::Search::Highlight, s.highlight
|
156
|
+
end
|
157
|
+
|
158
|
+
should "allow to specify highlight for more fields" do
|
159
|
+
s = Search::Search.new('index') do
|
160
|
+
highlight :body, :title
|
161
|
+
end
|
162
|
+
|
163
|
+
assert_not_nil s.highlight
|
164
|
+
assert_instance_of Tire::Search::Highlight, s.highlight
|
165
|
+
end
|
166
|
+
|
167
|
+
should "allow to specify highlight with for more fields with options" do
|
168
|
+
s = Search::Search.new('index') do
|
169
|
+
highlight :body, :title => { :fragment_size => 150, :number_of_fragments => 3 }
|
170
|
+
end
|
171
|
+
|
172
|
+
assert_not_nil s.highlight
|
173
|
+
assert_instance_of Tire::Search::Highlight, s.highlight
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
context "with from/size" do
|
179
|
+
|
180
|
+
should "set the values in request" do
|
181
|
+
s = Search::Search.new('index') do
|
182
|
+
size 5
|
183
|
+
from 3
|
184
|
+
end
|
185
|
+
hash = JSON.load( s.to_json )
|
186
|
+
assert_equal 5, hash['size']
|
187
|
+
assert_equal 3, hash['from']
|
188
|
+
end
|
189
|
+
|
190
|
+
should "set the fields limit in request" do
|
191
|
+
s = Search::Search.new('index') do
|
192
|
+
fields :title
|
193
|
+
end
|
194
|
+
hash = JSON.load( s.to_json )
|
195
|
+
assert_equal 'title', hash['fields']
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|