redis-textsearch 0.1.4 → 0.2.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/CHANGELOG.rdoc +12 -0
- data/lib/redis/text_search.rb +27 -15
- data/spec/redis_text_search_activerecord_spec.rb +34 -34
- data/spec/redis_text_search_core_spec.rb +53 -55
- data/spec/redis_text_search_sequel_spec.rb +34 -34
- data/spec/spec_helper.rb +4 -0
- metadata +10 -7
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
= Changelog for Redis::TextSearch
|
2
|
+
|
3
|
+
== 0.2.0 (12 August 2010)
|
4
|
+
|
5
|
+
* Now dependent on redis-rb client 2.0.4 or later. Should still be backwards compatible with redis-server 1.x
|
6
|
+
|
7
|
+
* Internal changes to bring client up-to-speed with redis-rb client changes
|
8
|
+
|
9
|
+
== 0.1.x series
|
10
|
+
|
11
|
+
* Core functionality implemented
|
12
|
+
|
data/lib/redis/text_search.rb
CHANGED
@@ -80,14 +80,14 @@ class Redis
|
|
80
80
|
pk = "#{table_name}.#{primary_key}"
|
81
81
|
case options[:conditions]
|
82
82
|
when Array
|
83
|
-
if options[:conditions][1].is_a?(Hash)
|
83
|
+
if options[:conditions][1].is_a?(::Hash)
|
84
84
|
options[:conditions][0] = "(#{options[:conditions][0]}) AND #{pk} IN (:text_search_ids)"
|
85
85
|
options[:conditions][1][:text_search_ids] = ids
|
86
86
|
else
|
87
87
|
options[:conditions][0] = "(#{options[:conditions][0]}) AND #{pk} IN (?)"
|
88
88
|
options[:conditions] << ids
|
89
89
|
end
|
90
|
-
when Hash
|
90
|
+
when ::Hash
|
91
91
|
if options[:conditions].has_key?(primary_key.to_sym)
|
92
92
|
raise BadConditions, "Cannot specify primary key (#{pk}) in :conditions to #{self.name}.text_search"
|
93
93
|
end
|
@@ -102,7 +102,7 @@ class Redis
|
|
102
102
|
# Define fields to be indexed for text search. To update the index, you must call
|
103
103
|
# update_text_indexes after record save or at the appropriate point.
|
104
104
|
def text_index(*args)
|
105
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
105
|
+
options = args.last.is_a?(::Hash) ? args.pop : {}
|
106
106
|
options[:minlength] ||= 2
|
107
107
|
options[:split] ||= /\s+/
|
108
108
|
raise ArgumentError, "Must specify fields to index to #{self.name}.text_index" unless args.length > 0
|
@@ -118,7 +118,7 @@ class Redis
|
|
118
118
|
# :page
|
119
119
|
# :per_page
|
120
120
|
def text_search(*args)
|
121
|
-
options = args.length > 1 && args.last.is_a?(Hash) ? args.pop : {}
|
121
|
+
options = args.length > 1 && args.last.is_a?(::Hash) ? args.pop : {}
|
122
122
|
fields = Array(options.delete(:fields) || @text_indexes.keys)
|
123
123
|
finder = options.delete(:finder)
|
124
124
|
unless finder
|
@@ -136,18 +136,18 @@ class Redis
|
|
136
136
|
ids = []
|
137
137
|
if args.empty?
|
138
138
|
raise ArgumentError, "Must specify search string(s) to #{self.name}.text_search"
|
139
|
-
elsif args.first.is_a?(Hash)
|
139
|
+
elsif args.first.is_a?(::Hash)
|
140
140
|
sets = []
|
141
141
|
args.first.each do |f,v|
|
142
142
|
sets += text_search_sets_for(f,v)
|
143
143
|
end
|
144
144
|
# Execute single intersection (AND)
|
145
|
-
ids = redis.
|
145
|
+
ids = redis.sinter(*sets)
|
146
146
|
else
|
147
147
|
fields.each do |f|
|
148
148
|
sets = text_search_sets_for(f,args)
|
149
149
|
# Execute intersection per loop (OR)
|
150
|
-
ids += redis.
|
150
|
+
ids += redis.sinter(*sets)
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
@@ -186,17 +186,24 @@ class Redis
|
|
186
186
|
def delete_text_indexes(id, *fields)
|
187
187
|
fields = @text_indexes.keys if fields.empty?
|
188
188
|
fields.each do |field|
|
189
|
-
|
190
|
-
|
191
|
-
|
189
|
+
indexes = text_indexes_for(id, field)
|
190
|
+
redis.pipelined do
|
191
|
+
indexes.each do |key|
|
192
|
+
redis.srem(key, id)
|
192
193
|
end
|
193
|
-
|
194
|
+
# blow away the entire reverse index, because we deleted the object
|
195
|
+
redis.del reverse_index_key(id, field)
|
194
196
|
end
|
195
197
|
end
|
196
198
|
end
|
197
199
|
|
200
|
+
def reverse_index_key(id, field)
|
201
|
+
field_key("#{field}_indexes", id)
|
202
|
+
end
|
203
|
+
|
198
204
|
def text_indexes_for(id, field) #:nodoc:
|
199
|
-
|
205
|
+
v = redis.get reverse_index_key(id, field)
|
206
|
+
(v.nil? || v == '') ? [] : v.split(';')
|
200
207
|
end
|
201
208
|
|
202
209
|
def text_search_sets_for(field, values)
|
@@ -225,6 +232,11 @@ class Redis
|
|
225
232
|
def text_indexes_for(field)
|
226
233
|
self.class.text_indexes_for(id, field)
|
227
234
|
end
|
235
|
+
|
236
|
+
# Name of the reverse index key
|
237
|
+
def reverse_index_key(field)
|
238
|
+
self.class.reverse_index_key(id, field)
|
239
|
+
end
|
228
240
|
|
229
241
|
# Retrieve all text indexes
|
230
242
|
def text_indexes
|
@@ -292,7 +304,7 @@ class Redis
|
|
292
304
|
exec_pipelined_index_cmd(:srem, del_indexes)
|
293
305
|
|
294
306
|
# Replace our reverse map of indexes
|
295
|
-
redis.set
|
307
|
+
redis.set reverse_index_key(field), indexes.join(';')
|
296
308
|
end # fields.each
|
297
309
|
end
|
298
310
|
|
@@ -311,9 +323,9 @@ class Redis
|
|
311
323
|
|
312
324
|
def exec_pipelined_index_cmd(cmd, indexes)
|
313
325
|
return if indexes.empty?
|
314
|
-
redis.pipelined do
|
326
|
+
redis.pipelined do
|
315
327
|
indexes.each do |key|
|
316
|
-
|
328
|
+
redis.send(cmd, key, id)
|
317
329
|
end
|
318
330
|
end
|
319
331
|
end
|
@@ -105,40 +105,40 @@ describe Redis::TextSearch do
|
|
105
105
|
@post.update_text_indexes
|
106
106
|
@post2.update_text_indexes
|
107
107
|
|
108
|
-
Post.redis.
|
109
|
-
Post.redis.
|
110
|
-
Post.redis.
|
111
|
-
Post.redis.
|
112
|
-
Post.redis.
|
113
|
-
Post.redis.
|
114
|
-
Post.redis.
|
115
|
-
Post.redis.
|
116
|
-
Post.redis.
|
117
|
-
Post.redis.
|
118
|
-
Post.redis.
|
119
|
-
Post.redis.
|
120
|
-
Post.redis.
|
121
|
-
Post.redis.
|
122
|
-
Post.redis.
|
123
|
-
Post.redis.
|
124
|
-
Post.redis.
|
125
|
-
Post.redis.
|
126
|
-
Post.redis.
|
127
|
-
Post.redis.
|
128
|
-
Post.redis.
|
129
|
-
Post.redis.
|
130
|
-
Post.redis.
|
131
|
-
Post.redis.
|
132
|
-
Post.redis.
|
133
|
-
Post.redis.
|
134
|
-
Post.redis.
|
135
|
-
Post.redis.
|
136
|
-
Post.redis.
|
137
|
-
Post.redis.
|
138
|
-
Post.redis.
|
139
|
-
Post.redis.
|
140
|
-
Post.redis.
|
141
|
-
Post.redis.
|
108
|
+
Post.redis.smembers('post:text_index:title:so').should == ['1']
|
109
|
+
Post.redis.smembers('post:text_index:title:som').should == ['1']
|
110
|
+
Post.redis.smembers('post:text_index:title:some').should == ['1']
|
111
|
+
Post.redis.smembers('post:text_index:title:pl').sort.should == ['1','2']
|
112
|
+
Post.redis.smembers('post:text_index:title:pla').sort.should == ['1','2']
|
113
|
+
Post.redis.smembers('post:text_index:title:plai').sort.should == ['1','2']
|
114
|
+
Post.redis.smembers('post:text_index:title:plain').sort.should == ['1','2']
|
115
|
+
Post.redis.smembers('post:text_index:title:te').sort.should == ['1','2']
|
116
|
+
Post.redis.smembers('post:text_index:title:tex').sort.should == ['1','2']
|
117
|
+
Post.redis.smembers('post:text_index:title:text').sort.should == ['1','2']
|
118
|
+
Post.redis.smembers('post:text_index:title:texts').should == ['2']
|
119
|
+
Post.redis.smembers('post:text_index:title:textst').should == ['2']
|
120
|
+
Post.redis.smembers('post:text_index:title:textstr').should == ['2']
|
121
|
+
Post.redis.smembers('post:text_index:title:textstri').should == ['2']
|
122
|
+
Post.redis.smembers('post:text_index:title:textstrin').should == ['2']
|
123
|
+
Post.redis.smembers('post:text_index:title:textstring').should == ['2']
|
124
|
+
Post.redis.smembers('post:text_index:tags:pe').should == []
|
125
|
+
Post.redis.smembers('post:text_index:tags:per').should == []
|
126
|
+
Post.redis.smembers('post:text_index:tags:pers').should == []
|
127
|
+
Post.redis.smembers('post:text_index:tags:perso').should == []
|
128
|
+
Post.redis.smembers('post:text_index:tags:person').should == []
|
129
|
+
Post.redis.smembers('post:text_index:tags:persona').should == []
|
130
|
+
Post.redis.smembers('post:text_index:tags:personal').should == ['1']
|
131
|
+
Post.redis.smembers('post:text_index:tags:no').should == []
|
132
|
+
Post.redis.smembers('post:text_index:tags:non').should == []
|
133
|
+
Post.redis.smembers('post:text_index:tags:nont').should == []
|
134
|
+
Post.redis.smembers('post:text_index:tags:nonte').should == []
|
135
|
+
Post.redis.smembers('post:text_index:tags:nontec').should == []
|
136
|
+
Post.redis.smembers('post:text_index:tags:nontech').should == []
|
137
|
+
Post.redis.smembers('post:text_index:tags:nontechn').should == []
|
138
|
+
Post.redis.smembers('post:text_index:tags:nontechni').should == []
|
139
|
+
Post.redis.smembers('post:text_index:tags:nontechnic').should == []
|
140
|
+
Post.redis.smembers('post:text_index:tags:nontechnica').should == []
|
141
|
+
Post.redis.smembers('post:text_index:tags:nontechnical').should == ['1']
|
142
142
|
end
|
143
143
|
|
144
144
|
it "should search text indexes and return records" do
|
@@ -44,7 +44,7 @@ TAGS = [
|
|
44
44
|
]
|
45
45
|
|
46
46
|
describe Redis::TextSearch do
|
47
|
-
|
47
|
+
it "should define text indexes in the class" do
|
48
48
|
@post = Post.new(:title => TITLES[0], :tags => TAGS[0] * ' ', :id => 1, :description => nil)
|
49
49
|
@post2 = Post.new(:title => TITLES[1], :tags => TAGS[1], :id => 2, :description => nil)
|
50
50
|
@post3 = Post.new(:title => TITLES[2], :tags => TAGS[2] * ' ', :id => 3, :description => nil)
|
@@ -52,9 +52,7 @@ describe Redis::TextSearch do
|
|
52
52
|
@post.delete_text_indexes
|
53
53
|
@post2.delete_text_indexes
|
54
54
|
Post.delete_text_indexes(3)
|
55
|
-
end
|
56
55
|
|
57
|
-
it "should define text indexes in the class" do
|
58
56
|
Post.text_indexes[:title][:key].should == 'post:text_index:title'
|
59
57
|
Post.text_indexes[:tags][:key].should == 'post:text_index:tags'
|
60
58
|
end
|
@@ -63,44 +61,44 @@ describe Redis::TextSearch do
|
|
63
61
|
@post.update_text_indexes
|
64
62
|
@post2.update_text_indexes
|
65
63
|
|
66
|
-
Post.redis.
|
67
|
-
Post.redis.
|
68
|
-
Post.redis.
|
69
|
-
Post.redis.
|
70
|
-
Post.redis.
|
71
|
-
Post.redis.
|
72
|
-
Post.redis.
|
73
|
-
Post.redis.
|
74
|
-
Post.redis.
|
75
|
-
Post.redis.
|
76
|
-
Post.redis.
|
77
|
-
Post.redis.
|
78
|
-
Post.redis.
|
79
|
-
Post.redis.
|
80
|
-
Post.redis.
|
81
|
-
Post.redis.
|
82
|
-
Post.redis.
|
83
|
-
Post.redis.
|
84
|
-
Post.redis.
|
85
|
-
Post.redis.
|
86
|
-
Post.redis.
|
87
|
-
Post.redis.
|
88
|
-
Post.redis.
|
89
|
-
Post.redis.
|
90
|
-
Post.redis.
|
91
|
-
Post.redis.
|
92
|
-
Post.redis.
|
93
|
-
Post.redis.
|
94
|
-
Post.redis.
|
95
|
-
Post.redis.
|
96
|
-
Post.redis.
|
97
|
-
Post.redis.
|
98
|
-
Post.redis.
|
99
|
-
Post.redis.
|
100
|
-
Post.redis.
|
101
|
-
Post.redis.
|
102
|
-
Post.redis.
|
103
|
-
Post.redis.
|
64
|
+
Post.redis.smembers('post:text_index:title:s').should == []
|
65
|
+
Post.redis.smembers('post:text_index:title:so').should == ['1']
|
66
|
+
Post.redis.smembers('post:text_index:title:som').should == ['1']
|
67
|
+
Post.redis.smembers('post:text_index:title:some').should == ['1']
|
68
|
+
Post.redis.smembers('post:text_index:title:pl').sort.should == ['1','2']
|
69
|
+
Post.redis.smembers('post:text_index:title:pla').sort.should == ['1','2']
|
70
|
+
Post.redis.smembers('post:text_index:title:plai').sort.should == ['1','2']
|
71
|
+
Post.redis.smembers('post:text_index:title:plain').sort.should == ['1','2']
|
72
|
+
Post.redis.smembers('post:text_index:title:t').should == []
|
73
|
+
Post.redis.smembers('post:text_index:title:te').sort.should == ['1','2']
|
74
|
+
Post.redis.smembers('post:text_index:title:tex').sort.should == ['1','2']
|
75
|
+
Post.redis.smembers('post:text_index:title:text').sort.should == ['1','2']
|
76
|
+
Post.redis.smembers('post:text_index:title:texts').should == ['2']
|
77
|
+
Post.redis.smembers('post:text_index:title:textst').should == ['2']
|
78
|
+
Post.redis.smembers('post:text_index:title:textstr').should == ['2']
|
79
|
+
Post.redis.smembers('post:text_index:title:textstri').should == ['2']
|
80
|
+
Post.redis.smembers('post:text_index:title:textstrin').should == ['2']
|
81
|
+
Post.redis.smembers('post:text_index:title:textstring').should == ['2']
|
82
|
+
Post.redis.smembers('post:text_index:tags:p').should == []
|
83
|
+
Post.redis.smembers('post:text_index:tags:pe').should == []
|
84
|
+
Post.redis.smembers('post:text_index:tags:per').should == []
|
85
|
+
Post.redis.smembers('post:text_index:tags:pers').should == []
|
86
|
+
Post.redis.smembers('post:text_index:tags:perso').should == []
|
87
|
+
Post.redis.smembers('post:text_index:tags:person').should == []
|
88
|
+
Post.redis.smembers('post:text_index:tags:persona').should == []
|
89
|
+
Post.redis.smembers('post:text_index:tags:personal').should == ['1']
|
90
|
+
Post.redis.smembers('post:text_index:tags:n').should == []
|
91
|
+
Post.redis.smembers('post:text_index:tags:no').should == []
|
92
|
+
Post.redis.smembers('post:text_index:tags:non').should == []
|
93
|
+
Post.redis.smembers('post:text_index:tags:nont').should == []
|
94
|
+
Post.redis.smembers('post:text_index:tags:nonte').should == []
|
95
|
+
Post.redis.smembers('post:text_index:tags:nontec').should == []
|
96
|
+
Post.redis.smembers('post:text_index:tags:nontech').should == []
|
97
|
+
Post.redis.smembers('post:text_index:tags:nontechn').should == []
|
98
|
+
Post.redis.smembers('post:text_index:tags:nontechni').should == []
|
99
|
+
Post.redis.smembers('post:text_index:tags:nontechnic').should == []
|
100
|
+
Post.redis.smembers('post:text_index:tags:nontechnica').should == []
|
101
|
+
Post.redis.smembers('post:text_index:tags:nontechnical').should == ['1']
|
104
102
|
end
|
105
103
|
|
106
104
|
it "should search text indexes and return records" do
|
@@ -156,20 +154,20 @@ describe Redis::TextSearch do
|
|
156
154
|
Post.text_search(:description => 'flame').should == ['4']
|
157
155
|
Post.text_search(:description => 'flame dude').should == [] # NOT SUPPORTED (must left-anchor)
|
158
156
|
|
159
|
-
Post.redis.
|
160
|
-
Post.redis.
|
161
|
-
Post.redis.
|
162
|
-
Post.redis.
|
163
|
-
Post.redis.
|
164
|
-
Post.redis.
|
165
|
-
Post.redis.
|
166
|
-
Post.redis.
|
167
|
-
Post.redis.
|
168
|
-
Post.redis.
|
169
|
-
Post.redis.
|
170
|
-
Post.redis.
|
171
|
-
Post.redis.
|
172
|
-
Post.redis.
|
157
|
+
Post.redis.smembers('post:text_index:description:red.flame.dude').should == ['4']
|
158
|
+
Post.redis.smembers('post:text_index:description:red.flame.dud').should == ['4']
|
159
|
+
Post.redis.smembers('post:text_index:description:red.flame.du').should == ['4']
|
160
|
+
Post.redis.smembers('post:text_index:description:red.flame.d').should == ['4']
|
161
|
+
Post.redis.smembers('post:text_index:description:red.flame.').should == ['4']
|
162
|
+
Post.redis.smembers('post:text_index:description:red.flame').should == ['4']
|
163
|
+
Post.redis.smembers('post:text_index:description:red.flam').should == ['4']
|
164
|
+
Post.redis.smembers('post:text_index:description:red.fla').should == ['4']
|
165
|
+
Post.redis.smembers('post:text_index:description:red.fl').should == ['4']
|
166
|
+
Post.redis.smembers('post:text_index:description:red.f').should == ['4']
|
167
|
+
Post.redis.smembers('post:text_index:description:red.').should == ['4']
|
168
|
+
Post.redis.smembers('post:text_index:description:red').should == ['4']
|
169
|
+
Post.redis.smembers('post:text_index:description:re').should == ['4']
|
170
|
+
Post.redis.smembers('post:text_index:description:r').should == []
|
173
171
|
end
|
174
172
|
|
175
173
|
# MUST BE LAST!!!!!!
|
@@ -105,40 +105,40 @@ describe Redis::TextSearch do
|
|
105
105
|
@post.update_text_indexes
|
106
106
|
@post2.update_text_indexes
|
107
107
|
|
108
|
-
Post.redis.
|
109
|
-
Post.redis.
|
110
|
-
Post.redis.
|
111
|
-
Post.redis.
|
112
|
-
Post.redis.
|
113
|
-
Post.redis.
|
114
|
-
Post.redis.
|
115
|
-
Post.redis.
|
116
|
-
Post.redis.
|
117
|
-
Post.redis.
|
118
|
-
Post.redis.
|
119
|
-
Post.redis.
|
120
|
-
Post.redis.
|
121
|
-
Post.redis.
|
122
|
-
Post.redis.
|
123
|
-
Post.redis.
|
124
|
-
Post.redis.
|
125
|
-
Post.redis.
|
126
|
-
Post.redis.
|
127
|
-
Post.redis.
|
128
|
-
Post.redis.
|
129
|
-
Post.redis.
|
130
|
-
Post.redis.
|
131
|
-
Post.redis.
|
132
|
-
Post.redis.
|
133
|
-
Post.redis.
|
134
|
-
Post.redis.
|
135
|
-
Post.redis.
|
136
|
-
Post.redis.
|
137
|
-
Post.redis.
|
138
|
-
Post.redis.
|
139
|
-
Post.redis.
|
140
|
-
Post.redis.
|
141
|
-
Post.redis.
|
108
|
+
Post.redis.smembers('post:text_index:title:so').should == ['1']
|
109
|
+
Post.redis.smembers('post:text_index:title:som').should == ['1']
|
110
|
+
Post.redis.smembers('post:text_index:title:some').should == ['1']
|
111
|
+
Post.redis.smembers('post:text_index:title:pl').sort.should == ['1','2']
|
112
|
+
Post.redis.smembers('post:text_index:title:pla').sort.should == ['1','2']
|
113
|
+
Post.redis.smembers('post:text_index:title:plai').sort.should == ['1','2']
|
114
|
+
Post.redis.smembers('post:text_index:title:plain').sort.should == ['1','2']
|
115
|
+
Post.redis.smembers('post:text_index:title:te').sort.should == ['1','2']
|
116
|
+
Post.redis.smembers('post:text_index:title:tex').sort.should == ['1','2']
|
117
|
+
Post.redis.smembers('post:text_index:title:text').sort.should == ['1','2']
|
118
|
+
Post.redis.smembers('post:text_index:title:texts').should == ['2']
|
119
|
+
Post.redis.smembers('post:text_index:title:textst').should == ['2']
|
120
|
+
Post.redis.smembers('post:text_index:title:textstr').should == ['2']
|
121
|
+
Post.redis.smembers('post:text_index:title:textstri').should == ['2']
|
122
|
+
Post.redis.smembers('post:text_index:title:textstrin').should == ['2']
|
123
|
+
Post.redis.smembers('post:text_index:title:textstring').should == ['2']
|
124
|
+
Post.redis.smembers('post:text_index:tags:pe').should == []
|
125
|
+
Post.redis.smembers('post:text_index:tags:per').should == []
|
126
|
+
Post.redis.smembers('post:text_index:tags:pers').should == []
|
127
|
+
Post.redis.smembers('post:text_index:tags:perso').should == []
|
128
|
+
Post.redis.smembers('post:text_index:tags:person').should == []
|
129
|
+
Post.redis.smembers('post:text_index:tags:persona').should == []
|
130
|
+
Post.redis.smembers('post:text_index:tags:personal').should == ['1']
|
131
|
+
Post.redis.smembers('post:text_index:tags:no').should == []
|
132
|
+
Post.redis.smembers('post:text_index:tags:non').should == []
|
133
|
+
Post.redis.smembers('post:text_index:tags:nont').should == []
|
134
|
+
Post.redis.smembers('post:text_index:tags:nonte').should == []
|
135
|
+
Post.redis.smembers('post:text_index:tags:nontec').should == []
|
136
|
+
Post.redis.smembers('post:text_index:tags:nontech').should == []
|
137
|
+
Post.redis.smembers('post:text_index:tags:nontechn').should == []
|
138
|
+
Post.redis.smembers('post:text_index:tags:nontechni').should == []
|
139
|
+
Post.redis.smembers('post:text_index:tags:nontechnic').should == []
|
140
|
+
Post.redis.smembers('post:text_index:tags:nontechnica').should == []
|
141
|
+
Post.redis.smembers('post:text_index:tags:nontechnical').should == ['1']
|
142
142
|
end
|
143
143
|
|
144
144
|
it "should search text indexes and return records" do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nate Wiger
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-08-12 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -25,9 +25,10 @@ dependencies:
|
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
|
+
- 2
|
28
29
|
- 0
|
29
|
-
-
|
30
|
-
version:
|
30
|
+
- 4
|
31
|
+
version: 2.0.4
|
31
32
|
type: :runtime
|
32
33
|
version_requirements: *id001
|
33
34
|
description: Crazy fast text search using Redis. Works with any ORM or data store.
|
@@ -37,6 +38,7 @@ executables: []
|
|
37
38
|
extensions: []
|
38
39
|
|
39
40
|
extra_rdoc_files:
|
41
|
+
- CHANGELOG.rdoc
|
40
42
|
- README.rdoc
|
41
43
|
files:
|
42
44
|
- lib/redis/text_search/collection.rb
|
@@ -45,6 +47,7 @@ files:
|
|
45
47
|
- spec/redis_text_search_core_spec.rb
|
46
48
|
- spec/redis_text_search_sequel_spec.rb
|
47
49
|
- spec/spec_helper.rb
|
50
|
+
- CHANGELOG.rdoc
|
48
51
|
- README.rdoc
|
49
52
|
has_rdoc: true
|
50
53
|
homepage: http://github.com/nateware/redis-textsearch
|
@@ -71,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
74
|
- 0
|
72
75
|
version: "0"
|
73
76
|
requirements:
|
74
|
-
- redis,
|
77
|
+
- redis, v2.0.4 or greater
|
75
78
|
rubyforge_project: redis-textsearch
|
76
79
|
rubygems_version: 1.3.6
|
77
80
|
signing_key:
|