elastic_searchable 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/elastic_searchable.gemspec +2 -2
- data/lib/elastic_searchable/callbacks.rb +2 -2
- data/lib/elastic_searchable/index.rb +35 -6
- data/test/test_elastic_searchable.rb +20 -1
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/elastic_searchable.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{elastic_searchable}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ryan Sonnek"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-08}
|
13
13
|
s.description = %q{integrate the elastic search engine with rails}
|
14
14
|
s.email = %q{ryan@codecrate.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -12,10 +12,10 @@ module ElasticSearchable
|
|
12
12
|
self.class.delete_id_from_index_backgrounded self.id
|
13
13
|
end
|
14
14
|
def update_index_on_create
|
15
|
-
|
15
|
+
reindex :create
|
16
16
|
end
|
17
17
|
def update_index_on_update
|
18
|
-
|
18
|
+
reindex :update
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -53,6 +53,35 @@ module ElasticSearchable
|
|
53
53
|
['', index_name, action].compact.join('/')
|
54
54
|
end
|
55
55
|
|
56
|
+
# reindex all records using bulk api
|
57
|
+
# options:
|
58
|
+
# :scope - scope the find_in_batches to only a subset of records
|
59
|
+
# :batch - counter to start indexing at
|
60
|
+
# :include - passed to find_in_batches to hydrate objects
|
61
|
+
# see http://www.elasticsearch.org/guide/reference/api/bulk.html
|
62
|
+
def reindex(options = {})
|
63
|
+
batch = options.delete(:batch) || 1
|
64
|
+
options[:batch_size] ||= 1000
|
65
|
+
options[:start] ||= (batch - 1) * options[:batch_size]
|
66
|
+
scope = options.delete(:scope) || self
|
67
|
+
scope.find_in_batches(options) do |records|
|
68
|
+
puts "reindexing batch ##{batch}..."
|
69
|
+
batch += 1
|
70
|
+
actions = []
|
71
|
+
records.each do |record|
|
72
|
+
next unless record.should_index?
|
73
|
+
begin
|
74
|
+
doc = record.as_json_for_index.to_json
|
75
|
+
actions << {:index => {'_index' => index_name, '_type' => index_type, '_id' => record.id}}.to_json
|
76
|
+
actions << doc
|
77
|
+
rescue => e
|
78
|
+
puts "Unable to bulk index record: #{record.inspect} [#{e.message}]"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
ElasticSearchable.request :put, '/_bulk', :body => "\n#{actions.join("\n")}\n"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
56
85
|
private
|
57
86
|
def index_name
|
58
87
|
self.elastic_options[:index] || ElasticSearchable.default_index
|
@@ -63,13 +92,13 @@ module ElasticSearchable
|
|
63
92
|
end
|
64
93
|
|
65
94
|
module InstanceMethods
|
66
|
-
#
|
67
|
-
#
|
95
|
+
# reindex the object in elasticsearch
|
96
|
+
# fires after_index callbacks after operation is complete
|
68
97
|
# see http://www.elasticsearch.org/guide/reference/api/index_.html
|
69
|
-
def
|
98
|
+
def reindex(lifecycle = nil)
|
70
99
|
query = {}
|
71
100
|
query.merge! :percolate => "*" if self.class.elastic_options[:percolate]
|
72
|
-
response = ElasticSearchable.request :put, self.class.index_type_path(self.id), :query => query, :body => self.
|
101
|
+
response = ElasticSearchable.request :put, self.class.index_type_path(self.id), :query => query, :body => self.as_json_for_index.to_json
|
73
102
|
|
74
103
|
self.run_callbacks("after_index_on_#{lifecycle}".to_sym) if lifecycle
|
75
104
|
self.run_callbacks(:after_index)
|
@@ -80,7 +109,7 @@ module ElasticSearchable
|
|
80
109
|
end
|
81
110
|
end
|
82
111
|
# document to index in elasticsearch
|
83
|
-
def
|
112
|
+
def as_json_for_index
|
84
113
|
self.as_json self.class.elastic_options[:json]
|
85
114
|
end
|
86
115
|
def should_index?
|
@@ -92,7 +121,7 @@ module ElasticSearchable
|
|
92
121
|
# can be done automatically when indexing using :percolate => true config option
|
93
122
|
# http://www.elasticsearch.org/blog/2011/02/08/percolator.html
|
94
123
|
def percolate
|
95
|
-
response = ElasticSearchable.request :get, self.class.index_type_path('_percolate'), :body => {:doc => self.
|
124
|
+
response = ElasticSearchable.request :get, self.class.index_type_path('_percolate'), :body => {:doc => self.as_json_for_index}.to_json
|
96
125
|
response['matches']
|
97
126
|
end
|
98
127
|
|
@@ -109,6 +109,25 @@ class TestElasticSearchable < Test::Unit::TestCase
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
+
context 'with empty index when multiple database records' do
|
113
|
+
setup do
|
114
|
+
Post.create_index
|
115
|
+
@first_post = Post.create :title => 'foo', :body => "first bar"
|
116
|
+
@second_post = Post.create :title => 'foo', :body => "second bar"
|
117
|
+
Post.clean_index
|
118
|
+
end
|
119
|
+
context 'Post.reindex' do
|
120
|
+
setup do
|
121
|
+
Post.reindex
|
122
|
+
Post.refresh_index
|
123
|
+
end
|
124
|
+
should 'have reindexed both records' do
|
125
|
+
ElasticSearchable.request :get, "/elastic_searchable/posts/#{@first_post.id}"
|
126
|
+
ElasticSearchable.request :get, "/elastic_searchable/posts/#{@second_post.id}"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
112
131
|
context 'with index containing multiple results' do
|
113
132
|
setup do
|
114
133
|
Post.create_index
|
@@ -182,7 +201,7 @@ class TestElasticSearchable < Test::Unit::TestCase
|
|
182
201
|
context 'activerecord class with optional :if=>proc configuration' do
|
183
202
|
context 'when creating new instance' do
|
184
203
|
setup do
|
185
|
-
Blog.any_instance.expects(:
|
204
|
+
Blog.any_instance.expects(:reindex).never
|
186
205
|
@blog = Blog.create! :title => 'foo'
|
187
206
|
end
|
188
207
|
should 'not index record' do end #see expectations
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elastic_searchable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 6
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Sonnek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-08 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|