searchkick 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +45 -3
- data/lib/searchkick/reindex.rb +64 -14
- data/lib/searchkick/search.rb +48 -30
- data/lib/searchkick/version.rb +1 -1
- data/test/autocomplete_test.rb +30 -0
- data/test/sql_test.rb +5 -0
- data/test/test_helper.rb +7 -1
- metadata +21 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdf75cc3dce90b3109799a5ee97e30c319d450ac
|
4
|
+
data.tar.gz: 646d884beeb278d6a056f662d9a9df6de2e0b6a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f97d141a413008ecb2ce03db8c29bd09aa0127af473f40428d0c21b350e4a0266931e347164f978c695a25ebd4c26b57cfd921ce39768355821387ffccad52e
|
7
|
+
data.tar.gz: 91b030868ca63ad185a67b91062d682a414d942f1e17b6af3aa1ff5dd6392831c240507cf0eb18bf025f4dc3522a40b042d411420608df85a2de6227a4be5378
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -148,6 +148,32 @@ To change this, use:
|
|
148
148
|
Product.search "fresh honey", partial: true # fresh OR honey
|
149
149
|
```
|
150
150
|
|
151
|
+
By default, results must match the entire word - `back` will not match `backpack`. You can change this behavior with:
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
class Product < ActiveRecord::Base
|
155
|
+
searchkick word_start: [:name]
|
156
|
+
end
|
157
|
+
```
|
158
|
+
|
159
|
+
And to search:
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
Product.search "back", fields: [{name: :word_start}]
|
163
|
+
```
|
164
|
+
|
165
|
+
Available options are:
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
:word # default
|
169
|
+
:word_start
|
170
|
+
:word_middle
|
171
|
+
:word_end
|
172
|
+
:text_start
|
173
|
+
:text_middle
|
174
|
+
:text_end
|
175
|
+
```
|
176
|
+
|
151
177
|
### Synonyms
|
152
178
|
|
153
179
|
```ruby
|
@@ -293,14 +319,14 @@ First, specify which fields use this feature. This is necessary since autocompl
|
|
293
319
|
|
294
320
|
```ruby
|
295
321
|
class City < ActiveRecord::Base
|
296
|
-
searchkick
|
322
|
+
searchkick text_start: [:name]
|
297
323
|
end
|
298
324
|
```
|
299
325
|
|
300
326
|
Reindex and search with:
|
301
327
|
|
302
328
|
```ruby
|
303
|
-
City.search "san fr",
|
329
|
+
City.search "san fr", fields: [{name: :text_start}]
|
304
330
|
```
|
305
331
|
|
306
332
|
Typically, you want to use a Javascript library like [typeahead.js](http://twitter.github.io/typeahead.js/) or [jQuery UI](http://jqueryui.com/autocomplete/).
|
@@ -314,7 +340,7 @@ First, add a controller action.
|
|
314
340
|
class CitiesController < ApplicationController
|
315
341
|
|
316
342
|
def autocomplete
|
317
|
-
render json: City.search(params[:query],
|
343
|
+
render json: City.search(params[:query], fields: [{name: :text_start}], limit: 10).map(&:name)
|
318
344
|
end
|
319
345
|
|
320
346
|
end
|
@@ -530,6 +556,14 @@ And use the `query` option to search:
|
|
530
556
|
Product.search query: {match: {name: "milk"}}
|
531
557
|
```
|
532
558
|
|
559
|
+
[master] To keep the mappings and settings generated by Searchkick, use:
|
560
|
+
|
561
|
+
```ruby
|
562
|
+
class Product < ActiveRecord::Base
|
563
|
+
searchkick merge_mappings: true, mappings: {...}
|
564
|
+
end
|
565
|
+
```
|
566
|
+
|
533
567
|
## Reference
|
534
568
|
|
535
569
|
Searchkick requires Elasticsearch `0.90.0` or higher.
|
@@ -601,6 +635,14 @@ class Product < ActiveRecord::Base
|
|
601
635
|
end
|
602
636
|
```
|
603
637
|
|
638
|
+
Change import batch size [master]
|
639
|
+
|
640
|
+
```ruby
|
641
|
+
class Product < ActiveRecord::Base
|
642
|
+
searchkick batch_size: 200 # defaults to 1000
|
643
|
+
end
|
644
|
+
```
|
645
|
+
|
604
646
|
Reindex all models (Rails only)
|
605
647
|
|
606
648
|
```sh
|
data/lib/searchkick/reindex.rb
CHANGED
@@ -57,11 +57,13 @@ module Searchkick
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def searchkick_import(index)
|
60
|
+
batch_size = searchkick_options[:batch_size] || 1000
|
61
|
+
|
60
62
|
# use scope for import
|
61
63
|
scope = searchkick_klass
|
62
64
|
scope = scope.search_import if scope.respond_to?(:search_import)
|
63
65
|
if scope.respond_to?(:find_in_batches)
|
64
|
-
scope.find_in_batches do |batch|
|
66
|
+
scope.find_in_batches batch_size: batch_size do |batch|
|
65
67
|
index.import batch.select{|item| item.should_index? }
|
66
68
|
end
|
67
69
|
else
|
@@ -70,7 +72,7 @@ module Searchkick
|
|
70
72
|
items = []
|
71
73
|
scope.all.each do |item|
|
72
74
|
items << item if item.should_index?
|
73
|
-
if items.length %
|
75
|
+
if items.length % batch_size == 0
|
74
76
|
index.import items
|
75
77
|
items = []
|
76
78
|
end
|
@@ -82,7 +84,7 @@ module Searchkick
|
|
82
84
|
def searchkick_index_options
|
83
85
|
options = searchkick_options
|
84
86
|
|
85
|
-
if options[:mappings]
|
87
|
+
if options[:mappings] and !options[:merge_mappings]
|
86
88
|
settings = options[:settings] || {}
|
87
89
|
mappings = options[:mappings]
|
88
90
|
else
|
@@ -126,6 +128,41 @@ module Searchkick
|
|
126
128
|
type: "custom",
|
127
129
|
tokenizer: "standard",
|
128
130
|
filter: ["lowercase", "asciifolding", "searchkick_suggest_shingle"]
|
131
|
+
},
|
132
|
+
searchkick_suggest_index: {
|
133
|
+
type: "custom",
|
134
|
+
tokenizer: "standard",
|
135
|
+
filter: ["lowercase", "asciifolding", "searchkick_suggest_shingle"]
|
136
|
+
},
|
137
|
+
searchkick_text_start_index: {
|
138
|
+
type: "custom",
|
139
|
+
tokenizer: "keyword",
|
140
|
+
filter: ["lowercase", "asciifolding", "searchkick_edge_ngram"]
|
141
|
+
},
|
142
|
+
searchkick_text_middle_index: {
|
143
|
+
type: "custom",
|
144
|
+
tokenizer: "keyword",
|
145
|
+
filter: ["lowercase", "asciifolding", "searchkick_ngram"]
|
146
|
+
},
|
147
|
+
searchkick_text_end_index: {
|
148
|
+
type: "custom",
|
149
|
+
tokenizer: "keyword",
|
150
|
+
filter: ["lowercase", "asciifolding", "reverse", "searchkick_edge_ngram", "reverse"]
|
151
|
+
},
|
152
|
+
searchkick_word_start_index: {
|
153
|
+
type: "custom",
|
154
|
+
tokenizer: "standard",
|
155
|
+
filter: ["lowercase", "asciifolding", "searchkick_edge_ngram"]
|
156
|
+
},
|
157
|
+
searchkick_word_middle_index: {
|
158
|
+
type: "custom",
|
159
|
+
tokenizer: "standard",
|
160
|
+
filter: ["lowercase", "asciifolding", "searchkick_ngram"]
|
161
|
+
},
|
162
|
+
searchkick_word_end_index: {
|
163
|
+
type: "custom",
|
164
|
+
tokenizer: "standard",
|
165
|
+
filter: ["lowercase", "asciifolding", "reverse", "searchkick_edge_ngram", "reverse"]
|
129
166
|
}
|
130
167
|
},
|
131
168
|
filter: {
|
@@ -143,6 +180,16 @@ module Searchkick
|
|
143
180
|
searchkick_suggest_shingle: {
|
144
181
|
type: "shingle",
|
145
182
|
max_shingle_size: 5
|
183
|
+
},
|
184
|
+
searchkick_edge_ngram: {
|
185
|
+
type: "edgeNGram",
|
186
|
+
min_gram: 1,
|
187
|
+
max_gram: 50
|
188
|
+
},
|
189
|
+
searchkick_ngram: {
|
190
|
+
type: "nGram",
|
191
|
+
min_gram: 1,
|
192
|
+
max_gram: 50
|
146
193
|
}
|
147
194
|
},
|
148
195
|
tokenizer: {
|
@@ -159,7 +206,7 @@ module Searchkick
|
|
159
206
|
settings.merge!(number_of_shards: 1, number_of_replicas: 0)
|
160
207
|
end
|
161
208
|
|
162
|
-
settings.
|
209
|
+
settings.deep_merge!(options[:settings] || {})
|
163
210
|
|
164
211
|
# synonyms
|
165
212
|
synonyms = options[:synonyms] || []
|
@@ -200,10 +247,12 @@ module Searchkick
|
|
200
247
|
}
|
201
248
|
end
|
202
249
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
250
|
+
mapping_options = Hash[
|
251
|
+
[:autocomplete, :suggest, :text_start, :text_middle, :text_end, :word_start, :word_middle, :word_end]
|
252
|
+
.map{|type| [type, (options[type] || []).map(&:to_s)] }
|
253
|
+
]
|
254
|
+
|
255
|
+
mapping_options.values.flatten.uniq.each do |field|
|
207
256
|
field_mapping = {
|
208
257
|
type: "multi_field",
|
209
258
|
fields: {
|
@@ -213,12 +262,13 @@ module Searchkick
|
|
213
262
|
# http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-highlighting.html#_fast_vector_highlighter
|
214
263
|
}
|
215
264
|
}
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
265
|
+
|
266
|
+
mapping_options.each do |type, fields|
|
267
|
+
if fields.include?(field)
|
268
|
+
field_mapping[:fields][type] = {type: "string", index: "analyzed", analyzer: "searchkick_#{type}_index"}
|
269
|
+
end
|
221
270
|
end
|
271
|
+
|
222
272
|
mapping[field] = field_mapping
|
223
273
|
end
|
224
274
|
|
@@ -253,7 +303,7 @@ module Searchkick
|
|
253
303
|
}
|
254
304
|
]
|
255
305
|
}
|
256
|
-
}
|
306
|
+
}.deep_merge(options[:mappings] || {})
|
257
307
|
end
|
258
308
|
|
259
309
|
{
|
data/lib/searchkick/search.rb
CHANGED
@@ -14,7 +14,10 @@ module Searchkick
|
|
14
14
|
if options[:autocomplete]
|
15
15
|
options[:fields].map{|f| "#{f}.autocomplete" }
|
16
16
|
else
|
17
|
-
options[:fields].map
|
17
|
+
options[:fields].map do |value|
|
18
|
+
k, v = value.is_a?(Hash) ? value.to_a.first : [value, :word]
|
19
|
+
"#{k}.#{v == :word ? "analyzed" : v}"
|
20
|
+
end
|
18
21
|
end
|
19
22
|
else
|
20
23
|
if options[:autocomplete]
|
@@ -67,23 +70,37 @@ module Searchkick
|
|
67
70
|
}
|
68
71
|
}
|
69
72
|
else
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
73
|
+
queries = []
|
74
|
+
fields.each do |field|
|
75
|
+
if field == "_all" or field.end_with?(".analyzed")
|
76
|
+
shared_options = {
|
77
|
+
fields: [field],
|
78
|
+
query: term,
|
79
|
+
use_dis_max: false,
|
80
|
+
operator: operator
|
81
|
+
}
|
82
|
+
queries.concat [
|
83
|
+
{multi_match: shared_options.merge(boost: 10, analyzer: "searchkick_search")},
|
84
|
+
{multi_match: shared_options.merge(boost: 10, analyzer: "searchkick_search2")}
|
85
|
+
]
|
86
|
+
if options[:misspellings] != false
|
87
|
+
distance = (options[:misspellings].is_a?(Hash) && options[:misspellings][:distance]) || 1
|
88
|
+
queries.concat [
|
89
|
+
{multi_match: shared_options.merge(fuzziness: distance, max_expansions: 3, analyzer: "searchkick_search")},
|
90
|
+
{multi_match: shared_options.merge(fuzziness: distance, max_expansions: 3, analyzer: "searchkick_search2")}
|
91
|
+
]
|
92
|
+
end
|
93
|
+
else
|
94
|
+
queries << {
|
95
|
+
multi_match: {
|
96
|
+
fields: [field],
|
97
|
+
query: term,
|
98
|
+
analyzer: "searchkick_autocomplete_search"
|
99
|
+
}
|
100
|
+
}
|
101
|
+
end
|
86
102
|
end
|
103
|
+
|
87
104
|
payload = {
|
88
105
|
dis_max: {
|
89
106
|
queries: queries
|
@@ -164,6 +181,17 @@ module Searchkick
|
|
164
181
|
payload[:sort] = order
|
165
182
|
end
|
166
183
|
|
184
|
+
term_filters =
|
185
|
+
proc do |field, value|
|
186
|
+
if value.is_a?(Array) # in query
|
187
|
+
{or: value.map{|v| term_filters.call(field, v) }}
|
188
|
+
elsif value.nil?
|
189
|
+
{missing: {"field" => field, existence: true, null_value: true}}
|
190
|
+
else
|
191
|
+
{term: {field => value}}
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
167
195
|
# where
|
168
196
|
where_filters =
|
169
197
|
proc do |where|
|
@@ -181,9 +209,7 @@ module Searchkick
|
|
181
209
|
value = {gte: value.first, (value.exclude_end? ? :lt : :lte) => value.last}
|
182
210
|
end
|
183
211
|
|
184
|
-
if value.is_a?(
|
185
|
-
filters << {terms: {field => value}}
|
186
|
-
elsif value.is_a?(Hash)
|
212
|
+
if value.is_a?(Hash)
|
187
213
|
if value[:near]
|
188
214
|
filters << {
|
189
215
|
geo_distance: {
|
@@ -206,11 +232,7 @@ module Searchkick
|
|
206
232
|
|
207
233
|
value.each do |op, op_value|
|
208
234
|
if op == :not # not equal
|
209
|
-
|
210
|
-
filters << {not: {terms: {field => op_value}}}
|
211
|
-
else
|
212
|
-
filters << {not: {term: {field => op_value}}}
|
213
|
-
end
|
235
|
+
filters << {not: term_filters.call(field, op_value)}
|
214
236
|
elsif op == :all
|
215
237
|
filters << {terms: {field => op_value, execution: "and"}}
|
216
238
|
else
|
@@ -231,11 +253,7 @@ module Searchkick
|
|
231
253
|
end
|
232
254
|
end
|
233
255
|
else
|
234
|
-
|
235
|
-
filters << {missing: {"field" => field, existence: true, null_value: true}}
|
236
|
-
else
|
237
|
-
filters << {term: {field => value}}
|
238
|
-
end
|
256
|
+
filters << term_filters.call(field, value)
|
239
257
|
end
|
240
258
|
end
|
241
259
|
end
|
data/lib/searchkick/version.rb
CHANGED
data/test/autocomplete_test.rb
CHANGED
@@ -17,4 +17,34 @@ class TestAutocomplete < Minitest::Unit::TestCase
|
|
17
17
|
assert_search "hum", ["Hummus"], autocomplete: true, fields: [:name]
|
18
18
|
end
|
19
19
|
|
20
|
+
def test_text_start
|
21
|
+
store_names ["Where in the World is Carmen San Diego?"]
|
22
|
+
assert_search "whe", ["Where in the World is Carmen San Diego?"], fields: [{name: :text_start}]
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_text_middle
|
26
|
+
store_names ["Where in the World is Carmen San Diego?"]
|
27
|
+
assert_search "n the wor", ["Where in the World is Carmen San Diego?"], fields: [{name: :text_middle}]
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_text_end
|
31
|
+
store_names ["Where in the World is Carmen San Diego?"]
|
32
|
+
assert_search "ego?", ["Where in the World is Carmen San Diego?"], fields: [{name: :text_end}]
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_word_start
|
36
|
+
store_names ["Where in the World is Carmen San Diego?"]
|
37
|
+
assert_search "car", ["Where in the World is Carmen San Diego?"], fields: [{name: :word_start}]
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_word_middle
|
41
|
+
store_names ["Where in the World is Carmen San Diego?"]
|
42
|
+
assert_search "orl", ["Where in the World is Carmen San Diego?"], fields: [{name: :word_middle}]
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_word_end
|
46
|
+
store_names ["Where in the World is Carmen San Diego?"]
|
47
|
+
assert_search "men", ["Where in the World is Carmen San Diego?"], fields: [{name: :word_end}]
|
48
|
+
end
|
49
|
+
|
20
50
|
end
|
data/test/sql_test.rb
CHANGED
@@ -67,6 +67,11 @@ class TestSql < Minitest::Unit::TestCase
|
|
67
67
|
# all
|
68
68
|
assert_search "product", ["Product A"], where: {user_ids: {all: [1, 3]}}
|
69
69
|
assert_search "product", [], where: {user_ids: {all: [1, 2, 3, 4]}}
|
70
|
+
# not / exists
|
71
|
+
assert_search "product", ["Product C", "Product D"], where: {user_ids: nil}
|
72
|
+
assert_search "product", ["Product A", "Product B"], where: {user_ids: {not: nil}}
|
73
|
+
assert_search "product", ["Product A", "Product C", "Product D"], where: {user_ids: [3, nil]}
|
74
|
+
assert_search "product", ["Product B"], where: {user_ids: {not: [3, nil]}}
|
70
75
|
end
|
71
76
|
|
72
77
|
def test_where_string
|
data/test/test_helper.rb
CHANGED
@@ -115,7 +115,13 @@ class Product
|
|
115
115
|
suggest: [:name, :color],
|
116
116
|
conversions: "conversions",
|
117
117
|
personalize: "user_ids",
|
118
|
-
locations: ["location", "multiple_locations"]
|
118
|
+
locations: ["location", "multiple_locations"],
|
119
|
+
text_start: [:name],
|
120
|
+
text_middle: [:name],
|
121
|
+
text_end: [:name],
|
122
|
+
word_start: [:name],
|
123
|
+
word_middle: [:name],
|
124
|
+
word_end: [:name]
|
119
125
|
|
120
126
|
attr_accessor :conversions, :user_ids
|
121
127
|
|
metadata
CHANGED
@@ -1,111 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: searchkick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tire
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: tire-contrib
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '4.7'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '4.7'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: activerecord
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: pg
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
description: Search made easy
|
@@ -115,8 +115,8 @@ executables: []
|
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
-
- .gitignore
|
119
|
-
- .travis.yml
|
118
|
+
- ".gitignore"
|
119
|
+
- ".travis.yml"
|
120
120
|
- CHANGELOG.md
|
121
121
|
- Gemfile
|
122
122
|
- LICENSE.txt
|
@@ -158,17 +158,17 @@ require_paths:
|
|
158
158
|
- lib
|
159
159
|
required_ruby_version: !ruby/object:Gem::Requirement
|
160
160
|
requirements:
|
161
|
-
- -
|
161
|
+
- - ">="
|
162
162
|
- !ruby/object:Gem::Version
|
163
163
|
version: '0'
|
164
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
165
|
requirements:
|
166
|
-
- -
|
166
|
+
- - ">="
|
167
167
|
- !ruby/object:Gem::Version
|
168
168
|
version: '0'
|
169
169
|
requirements: []
|
170
170
|
rubyforge_project:
|
171
|
-
rubygems_version: 2.
|
171
|
+
rubygems_version: 2.2.0
|
172
172
|
signing_key:
|
173
173
|
specification_version: 4
|
174
174
|
summary: Search made easy
|