tire 0.1.15 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/README.markdown +6 -0
- data/Rakefile +1 -1
- data/examples/rails-application-template.rb +1 -1
- data/examples/tire-dsl.rb +1 -0
- data/lib/tire/dsl.rb +1 -1
- data/lib/tire/model/indexing.rb +17 -3
- data/lib/tire/model/search.rb +4 -1
- data/lib/tire/results/collection.rb +23 -1
- data/lib/tire/search.rb +11 -6
- data/lib/tire/version.rb +6 -5
- data/test/integration/active_model_searchable_test.rb +13 -2
- data/test/unit/model_search_test.rb +57 -12
- data/test/unit/results_collection_test.rb +38 -0
- data/test/unit/rubyext_test.rb +1 -1
- data/test/unit/search_test.rb +29 -5
- metadata +10 -10
- data/examples/dsl.rb +0 -73
data/.gitignore
CHANGED
data/README.markdown
CHANGED
@@ -439,19 +439,25 @@ Any other parameters you provide to the `import` method are passed down to the `
|
|
439
439
|
Are we saying you have to fiddle with this thing in a `rails console` or silly Ruby scripts? No.
|
440
440
|
Just call the included _Rake_ task on the commandline:
|
441
441
|
|
442
|
+
```bash
|
442
443
|
$ rake environment tire:import CLASS='Article'
|
444
|
+
```
|
443
445
|
|
444
446
|
You can also force-import the data by deleting the index first (and creating it with mapping
|
445
447
|
provided by the `mapping` block in your model):
|
446
448
|
|
449
|
+
```bash
|
447
450
|
$ rake environment tire:import CLASS='Article' FORCE=true
|
451
|
+
```
|
448
452
|
|
449
453
|
When you'll spend more time with _ElasticSearch_, you'll notice how
|
450
454
|
[index aliases](http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html)
|
451
455
|
are the best idea since the invention of inverted index.
|
452
456
|
You can index your data into a fresh index (and possibly update an alias if everything's fine):
|
453
457
|
|
458
|
+
```bash
|
454
459
|
$ rake environment tire:import CLASS='Article' INDEX='articles-2011-05'
|
460
|
+
```
|
455
461
|
|
456
462
|
OK. All this time we have been talking about `ActiveRecord` models, since
|
457
463
|
it is a reasonable Rails' default for the storage layer.
|
data/Rakefile
CHANGED
@@ -213,7 +213,7 @@ gsub_file 'app/views/articles/index.html.erb', %r{<%= link_to 'New Article', new
|
|
213
213
|
CODE
|
214
214
|
|
215
215
|
gsub_file 'config/routes.rb', %r{resources :articles}, <<-CODE
|
216
|
-
|
216
|
+
resources :articles do
|
217
217
|
collection { get :search }
|
218
218
|
end
|
219
219
|
CODE
|
data/examples/tire-dsl.rb
CHANGED
@@ -580,6 +580,7 @@ end
|
|
580
580
|
#
|
581
581
|
# * [terms](http://www.elasticsearch.org/guide/reference/api/search/facets/terms-facet.html)
|
582
582
|
# * [date](http://www.elasticsearch.org/guide/reference/api/search/facets/date-histogram-facet.html)
|
583
|
+
# * [range](http://www.elasticsearch.org/guide/reference/api/search/facets/range-facet.html)
|
583
584
|
|
584
585
|
# We have seen that _ElasticSearch_ facets enable us to fetch complex aggregations from our data.
|
585
586
|
#
|
data/lib/tire/dsl.rb
CHANGED
data/lib/tire/model/indexing.rb
CHANGED
@@ -16,9 +16,23 @@ module Tire
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
def indexes(name, options = {})
|
20
|
-
|
21
|
-
|
19
|
+
def indexes(name, options = {}, &block)
|
20
|
+
options[:type] ||= 'string'
|
21
|
+
|
22
|
+
if block_given?
|
23
|
+
mapping[name] ||= { :type => 'object', :properties => {} }
|
24
|
+
@_nested_mapping = name
|
25
|
+
nested = yield
|
26
|
+
@_nested_mapping = nil
|
27
|
+
self
|
28
|
+
else
|
29
|
+
if @_nested_mapping
|
30
|
+
mapping[@_nested_mapping][:properties][name] = options
|
31
|
+
else
|
32
|
+
mapping[name] = options
|
33
|
+
end
|
34
|
+
self
|
35
|
+
end
|
22
36
|
end
|
23
37
|
|
24
38
|
def store_mapping?
|
data/lib/tire/model/search.rb
CHANGED
@@ -35,7 +35,10 @@ module Tire
|
|
35
35
|
def search(query=nil, options={}, &block)
|
36
36
|
old_wrapper = Tire::Configuration.wrapper
|
37
37
|
Tire::Configuration.wrapper self
|
38
|
-
|
38
|
+
|
39
|
+
sort = Array( options[:order] || options[:sort] )
|
40
|
+
options = {:type => document_type}.update(options)
|
41
|
+
|
39
42
|
unless block_given?
|
40
43
|
s = Tire::Search::Search.new(elasticsearch_index.name, options)
|
41
44
|
s.query { string query }
|
@@ -24,7 +24,7 @@ module Tire
|
|
24
24
|
document = {}
|
25
25
|
|
26
26
|
# Update the document with content and ID
|
27
|
-
document = h['_source'] ? document.update( h['_source'] || {} ) : document.update( h['fields']
|
27
|
+
document = h['_source'] ? document.update( h['_source'] || {} ) : document.update( __parse_fields__(h['fields']) )
|
28
28
|
document.update( {'id' => h['_id']} )
|
29
29
|
|
30
30
|
# Update the document with meta information
|
@@ -61,6 +61,28 @@ module Tire
|
|
61
61
|
self
|
62
62
|
end
|
63
63
|
|
64
|
+
# Handles _source prefixed fields properly: strips the prefix and converts fields to nested Hashes
|
65
|
+
#
|
66
|
+
def __parse_fields__(fields={})
|
67
|
+
( fields ||= {} ).clone.each_pair do |key,value|
|
68
|
+
next unless key.to_s =~ /_source/ # Skip regular JSON immediately
|
69
|
+
|
70
|
+
keys = key.to_s.split('.').reject { |n| n == '_source' }
|
71
|
+
fields.delete(key)
|
72
|
+
|
73
|
+
result = {}
|
74
|
+
path = []
|
75
|
+
|
76
|
+
keys.each do |name|
|
77
|
+
path << name
|
78
|
+
eval "result[:#{path.join('][:')}] ||= {}"
|
79
|
+
eval "result[:#{path.join('][:')}] = #{value.inspect}" if keys.last == name
|
80
|
+
end
|
81
|
+
fields.update result
|
82
|
+
end
|
83
|
+
fields
|
84
|
+
end
|
85
|
+
|
64
86
|
end
|
65
87
|
|
66
88
|
end
|
data/lib/tire/search.rb
CHANGED
@@ -5,11 +5,17 @@ module Tire
|
|
5
5
|
|
6
6
|
attr_reader :indices, :url, :results, :response, :json, :query, :facets, :filters, :options
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
def initialize(indices=nil, options = {}, &block)
|
9
|
+
Tire.warn "Passing indices as multiple arguments to the `Search.new` method " +
|
10
|
+
"has been deprecated, please pass them as an Array: " +
|
11
|
+
"Search.new([#{indices}, #{options}])" if options.is_a?(String)
|
12
|
+
@indices = Array(indices)
|
13
|
+
@options = options
|
14
|
+
@type = @options[:type]
|
12
15
|
|
16
|
+
@url = Configuration.url+['/', @indices.join(','), @type, '_search'].compact.join('/').squeeze('/')
|
17
|
+
|
18
|
+
# TODO: Do not allow changing the wrapper here or set it back after yield
|
13
19
|
Configuration.wrapper @options[:wrapper] if @options[:wrapper]
|
14
20
|
block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given?
|
15
21
|
end
|
@@ -64,7 +70,6 @@ module Tire
|
|
64
70
|
end
|
65
71
|
|
66
72
|
def perform
|
67
|
-
@url = "#{Configuration.url}/#{indices.join(',')}/_search"
|
68
73
|
@response = Configuration.client.get(@url, self.to_json)
|
69
74
|
@json = MultiJson.decode(@response.body)
|
70
75
|
@results = Results::Collection.new(@json, @options)
|
@@ -77,7 +82,7 @@ module Tire
|
|
77
82
|
end
|
78
83
|
|
79
84
|
def to_curl
|
80
|
-
%Q|curl -X GET "#{
|
85
|
+
%Q|curl -X GET "#{@url}?pretty=true" -d '#{self.to_json}'|
|
81
86
|
end
|
82
87
|
|
83
88
|
def to_hash
|
data/lib/tire/version.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Tire
|
2
|
-
VERSION
|
2
|
+
VERSION = "0.1.16"
|
3
3
|
|
4
4
|
CHANGELOG =<<-END
|
5
5
|
IMPORTANT CHANGES LATELY:
|
6
6
|
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
7
|
+
# Defined mapping for nested fields [#56]
|
8
|
+
# Mapping type is optional and defaults to "string"
|
9
|
+
# Fixed handling of fields returned prefixed by _source from ES [#31]
|
10
|
+
# Allow passing the type to search and added that model passes `document_type` to search [@jonkarna, #38]
|
11
|
+
# Allow leaving index name empty for searching the whole server
|
11
12
|
END
|
12
13
|
end
|
@@ -36,12 +36,22 @@ module Tire
|
|
36
36
|
a.save
|
37
37
|
id = a.id
|
38
38
|
|
39
|
+
# Store document of another type in the index
|
40
|
+
Index.new 'supermodel_articles' do
|
41
|
+
store :type => 'other-thing', :title => 'Title for other thing'
|
42
|
+
end
|
43
|
+
|
39
44
|
a.index.refresh
|
40
45
|
sleep(1.5)
|
41
46
|
|
47
|
+
# The index should contain 2 documents
|
48
|
+
assert_equal 2, Tire.search('supermodel_articles') { query { all } }.results.size
|
49
|
+
|
42
50
|
results = SupermodelArticle.search 'test'
|
43
51
|
|
52
|
+
# The model should find only 1 document
|
44
53
|
assert_equal 1, results.count
|
54
|
+
|
45
55
|
assert_instance_of SupermodelArticle, results.first
|
46
56
|
assert_equal 'Test', results.first.title
|
47
57
|
assert_not_nil results.first._score
|
@@ -63,14 +73,15 @@ module Tire
|
|
63
73
|
|
64
74
|
should "retrieve sorted documents by IDs returned from search" do
|
65
75
|
SupermodelArticle.create! :title => 'foo'
|
66
|
-
SupermodelArticle.create! :title => 'bar'
|
76
|
+
SupermodelArticle.create! :id => 'abc123', :title => 'bar'
|
67
77
|
|
68
78
|
SupermodelArticle.elasticsearch_index.refresh
|
69
79
|
results = SupermodelArticle.search 'foo OR bar^100'
|
70
80
|
|
71
81
|
assert_equal 2, results.count
|
72
82
|
|
73
|
-
assert_equal 'bar',
|
83
|
+
assert_equal 'bar', results.first.title
|
84
|
+
assert_equal 'abc123', results.first.id
|
74
85
|
end
|
75
86
|
|
76
87
|
end
|
@@ -20,6 +20,7 @@ module Tire
|
|
20
20
|
|
21
21
|
setup do
|
22
22
|
@stub = stub('search') { stubs(:query).returns(self); stubs(:perform).returns(self); stubs(:results).returns([]) }
|
23
|
+
Tire::Index.any_instance.stubs(:exists?).returns(false)
|
23
24
|
end
|
24
25
|
|
25
26
|
teardown do
|
@@ -51,31 +52,36 @@ module Tire
|
|
51
52
|
should_eventually "NOT overload existing top-level instance methods" do
|
52
53
|
end
|
53
54
|
|
54
|
-
should "
|
55
|
-
|
56
|
-
|
55
|
+
should "limit searching in index for documents matching the model 'document_type'" do
|
56
|
+
Tire::Search::Search.
|
57
|
+
expects(:new).
|
58
|
+
with(ActiveModelArticle.index_name, { :type => ActiveModelArticle.document_type }).
|
59
|
+
returns(@stub).
|
60
|
+
twice
|
57
61
|
|
58
62
|
ActiveModelArticle.search 'foo'
|
59
|
-
|
60
|
-
|
61
|
-
should_eventually "search only in document types for this class by default" do
|
63
|
+
ActiveModelArticle.search { query { string 'foo' } }
|
62
64
|
end
|
63
65
|
|
64
66
|
should "search in custom name" do
|
65
67
|
first = 'custom-index-name'
|
66
68
|
second = 'another-custom-index-name'
|
69
|
+
expected_options = { :type => ActiveModelArticleWithCustomIndexName.document_type }
|
67
70
|
|
68
|
-
Tire::Search::Search.expects(:new).with(first,
|
69
|
-
ActiveModelArticleWithCustomIndexName.index_name
|
71
|
+
Tire::Search::Search.expects(:new).with(first, expected_options).returns(@stub).twice
|
72
|
+
ActiveModelArticleWithCustomIndexName.index_name first
|
70
73
|
ActiveModelArticleWithCustomIndexName.search 'foo'
|
74
|
+
ActiveModelArticleWithCustomIndexName.search { query { string 'foo' } }
|
71
75
|
|
72
|
-
Tire::Search::Search.expects(:new).with(second,
|
73
|
-
ActiveModelArticleWithCustomIndexName.index_name
|
76
|
+
Tire::Search::Search.expects(:new).with(second, expected_options).returns(@stub).twice
|
77
|
+
ActiveModelArticleWithCustomIndexName.index_name second
|
74
78
|
ActiveModelArticleWithCustomIndexName.search 'foo'
|
79
|
+
ActiveModelArticleWithCustomIndexName.search { query { string 'foo' } }
|
75
80
|
|
76
|
-
Tire::Search::Search.expects(:new).with(first,
|
77
|
-
ActiveModelArticleWithCustomIndexName.index_name
|
81
|
+
Tire::Search::Search.expects(:new).with(first, expected_options).returns(@stub).twice
|
82
|
+
ActiveModelArticleWithCustomIndexName.index_name first
|
78
83
|
ActiveModelArticleWithCustomIndexName.search 'foo'
|
84
|
+
ActiveModelArticleWithCustomIndexName.search { query { string 'foo' } }
|
79
85
|
end
|
80
86
|
|
81
87
|
should "allow to refresh index" do
|
@@ -256,6 +262,45 @@ module Tire
|
|
256
262
|
assert_equal 'snowball', ModelWithCustomMapping.mapping[:title][:analyzer]
|
257
263
|
end
|
258
264
|
|
265
|
+
should "define mapping for nested properties with a block" do
|
266
|
+
expected_mapping = {
|
267
|
+
:mappings => { :model_with_nested_mapping => {
|
268
|
+
:properties => {
|
269
|
+
:title => { :type => 'string' },
|
270
|
+
:author => {
|
271
|
+
:type => 'object',
|
272
|
+
:properties => {
|
273
|
+
:first_name => { :type => 'string' },
|
274
|
+
:last_name => { :type => 'string', :boost => 100 }
|
275
|
+
}
|
276
|
+
}
|
277
|
+
}
|
278
|
+
}
|
279
|
+
}}
|
280
|
+
|
281
|
+
Tire::Index.any_instance.expects(:create).with(expected_mapping)
|
282
|
+
|
283
|
+
class ::ModelWithNestedMapping
|
284
|
+
extend ActiveModel::Naming
|
285
|
+
extend ActiveModel::Callbacks
|
286
|
+
|
287
|
+
include Tire::Model::Search
|
288
|
+
include Tire::Model::Callbacks
|
289
|
+
|
290
|
+
mapping do
|
291
|
+
indexes :title, :type => 'string'
|
292
|
+
indexes :author do
|
293
|
+
indexes :first_name, :type => 'string'
|
294
|
+
indexes :last_name, :type => 'string', :boost => 100
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
end
|
299
|
+
|
300
|
+
assert_not_nil ModelWithNestedMapping.mapping[:author][:properties][:last_name]
|
301
|
+
assert_equal 100, ModelWithNestedMapping.mapping[:author][:properties][:last_name][:boost]
|
302
|
+
end
|
303
|
+
|
259
304
|
end
|
260
305
|
|
261
306
|
context "with index update callbacks" do
|
@@ -105,6 +105,44 @@ module Tire
|
|
105
105
|
|
106
106
|
end
|
107
107
|
|
108
|
+
context "wrapping results with selected fields" do
|
109
|
+
# When limiting fields from _source to return ES returns them prefixed, not as "real" Hashes.
|
110
|
+
# Underlying issue: https://github.com/karmi/tire/pull/31#issuecomment-1340967
|
111
|
+
#
|
112
|
+
setup do
|
113
|
+
Configuration.reset :wrapper
|
114
|
+
@default_response = { 'hits' => { 'hits' =>
|
115
|
+
[ { '_id' => 1, '_score' => 0.5, '_index' => 'testing', '_type' => 'article',
|
116
|
+
'fields' => {
|
117
|
+
'title' => 'Knee Deep in JSON',
|
118
|
+
'crazy.field' => 'CRAAAAZY!',
|
119
|
+
'_source.artist' => {
|
120
|
+
'name' => 'Elastiq',
|
121
|
+
'meta' => {
|
122
|
+
'favorited' => 1000,
|
123
|
+
'url' => 'http://first.fm/abc123/xyz567'
|
124
|
+
}
|
125
|
+
},
|
126
|
+
'_source.track.info.duration' => {
|
127
|
+
'minutes' => 3
|
128
|
+
}
|
129
|
+
} } ] } }
|
130
|
+
collection = Results::Collection.new(@default_response)
|
131
|
+
@item = collection.first
|
132
|
+
end
|
133
|
+
|
134
|
+
should "return fields from the first level" do
|
135
|
+
assert_equal 'Knee Deep in JSON', @item.title
|
136
|
+
end
|
137
|
+
|
138
|
+
should "return fields from the _source prefixed and nested fields" do
|
139
|
+
assert_equal 'Elastiq', @item.artist.name
|
140
|
+
assert_equal 1000, @item.artist.meta.favorited
|
141
|
+
assert_equal 3, @item.track.info.duration.minutes
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
108
146
|
context "while paginating results" do
|
109
147
|
|
110
148
|
setup do
|
data/test/unit/rubyext_test.rb
CHANGED
@@ -36,7 +36,7 @@ module Tire
|
|
36
36
|
|
37
37
|
should "properly serialize Time into JSON" do
|
38
38
|
json = { :time => Time.mktime(2011, 01, 01, 11, 00).to_json }.to_json
|
39
|
-
|
39
|
+
assert_match /"2011-01-01T11:00:00.*"/, MultiJson.decode(json)['time']
|
40
40
|
end
|
41
41
|
|
42
42
|
end
|
data/test/unit/search_test.rb
CHANGED
@@ -7,8 +7,32 @@ module Tire
|
|
7
7
|
context "Search" do
|
8
8
|
setup { Configuration.reset :logger }
|
9
9
|
|
10
|
-
should "be initialized with index
|
11
|
-
|
10
|
+
should "be initialized with single index" do
|
11
|
+
s = Search::Search.new('index') { query { string 'foo' } }
|
12
|
+
assert_match %r|/index/_search|, s.url
|
13
|
+
end
|
14
|
+
|
15
|
+
should "be initialized with multiple indices" do
|
16
|
+
s = Search::Search.new(['index1','index2']) { query { string 'foo' } }
|
17
|
+
assert_match %r|/index1,index2/_search|, s.url
|
18
|
+
end
|
19
|
+
|
20
|
+
should "be initialized with multiple indices as string" do
|
21
|
+
s = Search::Search.new(['index1,index2,index3']) { query { string 'foo' } }
|
22
|
+
assert_match %r|/index1,index2,index3/_search|, s.url
|
23
|
+
end
|
24
|
+
|
25
|
+
should "allow to search all indices by leaving index empty" do
|
26
|
+
s = Search::Search.new { query { string 'foo' } }
|
27
|
+
assert_match %r|localhost:9200/_search|, s.url
|
28
|
+
end
|
29
|
+
|
30
|
+
should "allow to limit results with document type" do
|
31
|
+
s = Search::Search.new('index', :type => 'bar') do
|
32
|
+
query { string 'foo' }
|
33
|
+
end
|
34
|
+
|
35
|
+
assert_match %r|index/bar/_search|, s.url
|
12
36
|
end
|
13
37
|
|
14
38
|
should "allow to pass block to query" do
|
@@ -35,7 +59,7 @@ module Tire
|
|
35
59
|
s = Search::Search.new('index1') do;end
|
36
60
|
assert_equal ['index1'], s.indices
|
37
61
|
|
38
|
-
s = Search::Search.new('index1', 'index2') do;end
|
62
|
+
s = Search::Search.new(['index1', 'index2']) do;end
|
39
63
|
assert_equal ['index1', 'index2'], s.indices
|
40
64
|
end
|
41
65
|
|
@@ -49,14 +73,14 @@ module Tire
|
|
49
73
|
end
|
50
74
|
|
51
75
|
should "return curl snippet with multiple indices for debugging" do
|
52
|
-
s = Search::Search.new('index_1', 'index_2') do
|
76
|
+
s = Search::Search.new(['index_1', 'index_2']) do
|
53
77
|
query { string 'title:foo' }
|
54
78
|
end
|
55
79
|
assert_match /index_1,index_2/, s.to_curl
|
56
80
|
end
|
57
81
|
|
58
82
|
should "return itself as a Hash" do
|
59
|
-
s = Search::Search.new('
|
83
|
+
s = Search::Search.new('index') do
|
60
84
|
query { string 'title:foo' }
|
61
85
|
end
|
62
86
|
assert_nothing_raised do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 59
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 16
|
10
|
+
version: 0.1.16
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Karel Minarik
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-14 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rake
|
@@ -255,7 +255,6 @@ files:
|
|
255
255
|
- MIT-LICENSE
|
256
256
|
- README.markdown
|
257
257
|
- Rakefile
|
258
|
-
- examples/dsl.rb
|
259
258
|
- examples/rails-application-template.rb
|
260
259
|
- examples/tire-dsl.rb
|
261
260
|
- lib/tire.rb
|
@@ -347,12 +346,13 @@ post_install_message: |
|
|
347
346
|
|
348
347
|
IMPORTANT CHANGES LATELY:
|
349
348
|
|
350
|
-
#
|
351
|
-
#
|
352
|
-
#
|
353
|
-
#
|
349
|
+
# Defined mapping for nested fields [#56]
|
350
|
+
# Mapping type is optional and defaults to "string"
|
351
|
+
# Fixed handling of fields returned prefixed by _source from ES [#31]
|
352
|
+
# Allow passing the type to search and added that model passes `document_type` to search [@jonkarna, #38]
|
353
|
+
# Allow leaving index name empty for searching the whole server
|
354
354
|
|
355
|
-
See the full changelog at <http://github.com/karmi/tire/commits/v0.1.
|
355
|
+
See the full changelog at <http://github.com/karmi/tire/commits/v0.1.16>.
|
356
356
|
|
357
357
|
--------------------------------------------------------------------------------
|
358
358
|
|
data/examples/dsl.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'tire'
|
5
|
-
|
6
|
-
extend Tire::DSL
|
7
|
-
|
8
|
-
configure do
|
9
|
-
url "http://localhost:9200"
|
10
|
-
end
|
11
|
-
|
12
|
-
index 'articles' do
|
13
|
-
delete
|
14
|
-
create
|
15
|
-
|
16
|
-
puts "Documents:", "-"*80
|
17
|
-
[
|
18
|
-
{ :title => 'One', :tags => ['ruby'] },
|
19
|
-
{ :title => 'Two', :tags => ['ruby', 'python'] },
|
20
|
-
{ :title => 'Three', :tags => ['java'] },
|
21
|
-
{ :title => 'Four', :tags => ['ruby', 'php'] }
|
22
|
-
].each do |article|
|
23
|
-
puts "Indexing article: #{article.to_json}"
|
24
|
-
store article
|
25
|
-
end
|
26
|
-
|
27
|
-
refresh
|
28
|
-
end
|
29
|
-
|
30
|
-
s = search 'articles' do
|
31
|
-
query do
|
32
|
-
string 'T*'
|
33
|
-
end
|
34
|
-
|
35
|
-
filter :terms, :tags => ['ruby']
|
36
|
-
|
37
|
-
sort do
|
38
|
-
title 'desc'
|
39
|
-
end
|
40
|
-
|
41
|
-
facet 'global-tags' do
|
42
|
-
terms :tags, :global => true
|
43
|
-
end
|
44
|
-
|
45
|
-
facet 'current-tags' do
|
46
|
-
terms :tags
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
puts "", "Query:", "-"*80
|
51
|
-
puts s.to_json
|
52
|
-
|
53
|
-
puts "", "Raw JSON result:", "-"*80
|
54
|
-
puts JSON.pretty_generate(s.response)
|
55
|
-
|
56
|
-
puts "", "Try the query in Curl:", "-"*80
|
57
|
-
puts s.to_curl
|
58
|
-
|
59
|
-
puts "", "Results:", "-"*80
|
60
|
-
s.results.each_with_index do |document, i|
|
61
|
-
puts "#{i+1}. #{ document.title.ljust(10) } [id] #{document._id}"
|
62
|
-
end
|
63
|
-
|
64
|
-
puts "", "Facets: tags distribution across the whole database:", "-"*80
|
65
|
-
s.results.facets['global-tags']['terms'].each do |f|
|
66
|
-
puts "#{f['term'].ljust(13)} #{f['count']}"
|
67
|
-
end
|
68
|
-
|
69
|
-
puts "", "Facets: tags distribution for the current query ",
|
70
|
-
"(Notice that 'java' is included, because of the filter)", "-"*80
|
71
|
-
s.results.facets['current-tags']['terms'].each do |f|
|
72
|
-
puts "#{f['term'].ljust(13)} #{f['count']}"
|
73
|
-
end
|