mongoid_fulltext 0.5.7 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -6,7 +6,7 @@ gem "unicode_utils", "~> 1.0.0"
6
6
  # Include everything needed to run rake, tests, features, etc.
7
7
  group :development do
8
8
  gem "mongoid", "~> 2.0.0"
9
- gem "bson_ext", "~> 1.3.0"
9
+ gem "bson_ext", "~> 1.5.2"
10
10
  gem "rspec", "~> 2.5.0"
11
11
  gem "jeweler", "~> 1.5.2"
12
12
  end
data/README.md CHANGED
@@ -10,6 +10,11 @@ lets you do a fuzzy string search across relatively short strings, which makes i
10
10
  autocomplete boxes based on the display names of your Rails models but not appropriate for, say,
11
11
  indexing hundreds of thousands of HTML documents.
12
12
 
13
+ Install
14
+ --------------
15
+
16
+ gem 'mongoid_fulltext'
17
+
13
18
  Some examples:
14
19
  --------------
15
20
 
@@ -217,26 +222,23 @@ Indexing Options
217
222
 
218
223
  Additional indexing/query options can be used as parameters to `fulltext_search_in`.
219
224
 
220
- * `alphabet`: letters to index, default is `abcdefghijklmnopqrstuvwxyz0123456789 `
225
+ * `alphabet`: letters to index, default is `abcdefghijklmnopqrstuvwxyz0123456789 `.
221
226
  * `word_separators`: word separators, default is the space character.
222
- * `ngram_width`: ngram width, default is `3`
227
+ * `ngram_width`: ngram width, default is `3`.
223
228
  * `index_full_words`: index full words, which improves exact matches, default is `true`.
224
229
  * `index_short_prefixes`: index a prefix of each full word of length `(ngram_width-1)`. Useful if
225
230
  you use a larger ngram_width than the default of 3. Default for this option is `false`.
226
231
  * `stop_words`: a hash of words to avoid indexing as full words. Used only if `index_full_words`
227
232
  is set to `true`. Defaults to a hash containing a list of common English stop words.
228
- * `apply_prefix_scoring_to_all_words`: score n-grams at beginning of words higher, default is `true`
229
- * `max_ngrams_to_search`: maximum number of ngrams to query at any given time, default is `6`
233
+ * `apply_prefix_scoring_to_all_words`: score n-grams at beginning of words higher, default is `true`.
234
+ * `max_ngrams_to_search`: maximum number of ngrams to query at any given time, default is `6`.
230
235
  * `max_candidate_set_size`: maximum number of candidate ngrams to examine for a given query.
231
236
  Defaults to 1000. If you're seeing poor results, you can try increasing this value to consider
232
237
  more ngrams per query (changing this parameter does not require a re-index.) The amount of time
233
238
  a search takes is directly proportional to this parameter's value.
234
- * `remove_accents`: remove accents on accented characters or not. Defaults to true. If a string
235
- is encoded in UTF-8, we strip the accents using NFKD normalization (via an external library,
236
- `unicode_utils`. If a string is encoded in ASCII-8BIT, we assume it has been passed via a
237
- URL, for instance we might have "%C3%A9" which is how an "e-accute" ("é") gets passed
238
- through a web-browser. These are then changed to their UTF-8 equivalents (via the `CGI` gem)
239
- and then finally stripped, as before.
239
+ * `remove_accents`: remove accents on accented characters, default is `true`.
240
+ We strip the accents using [NFKD normalization](http://unicode-utils.rubyforge.org/UnicodeUtils.html#method-c-compatibility_decomposition)
241
+ using an external library, `unicode_utils`.
240
242
  * `update_if`: controls whether or not the index will be updated. This can be set to a symbol,
241
243
  string, or proc. If the result of evaluating the value is true, the index will be updated.
242
244
  * When set to a symbol, the symbol is sent to the document.
@@ -275,6 +277,20 @@ at both the Art Basel and the New York Armory exhibition.
275
277
  # Artists at both the Art Basel and the New York Armory exhibition
276
278
  Artist.fulltext_search('foobar', :exhibitions => [ "Art Basel", "New York Armory" ])
277
279
 
280
+ # Note that the following explicit syntax may be used to achieve the
281
+ # same result as above
282
+ Artist.fulltext_search('foobar', :exhibitions => {:all => [ "Art Basel", "New York Armory" ]})
283
+
284
+ If you want to find all artists that are at either the Art Basel or the
285
+ New York Armory exhibition, then you may specify the `:any` operator in
286
+ the filter.
287
+
288
+ # Artists at either the Art Basel or the New York Armory exhibition
289
+ Artist.fulltext_search('foobar', :exhibitions => {:any => [ "Art Basel", "New York Armory" ]})
290
+
291
+ Note that `:all` and `:any` are currently the only supported operators
292
+ for the array filters.
293
+
278
294
  Building the index
279
295
  ------------------
280
296
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.7
1
+ 0.5.8
@@ -10,6 +10,7 @@ module Mongoid::FullTextSearch
10
10
  end
11
11
 
12
12
  class UnspecifiedIndexError < StandardError; end
13
+ class UnknownFilterQueryOperator < StandardError; end
13
14
 
14
15
  module ClassMethods
15
16
 
@@ -86,7 +87,7 @@ module Mongoid::FullTextSearch
86
87
  next if !keys.member?('ngram')
87
88
  all_filter_keys |= keys.find_all{ |key| key.starts_with?('filter_values.') }
88
89
  if keys & correct_keys != correct_keys
89
- Mongoid.logger.info "Droping #{name} [#{keys & correct_keys} <=> #{correct_keys}]"
90
+ Mongoid.logger.info "Dropping #{name} [#{keys & correct_keys} <=> #{correct_keys}]" if Mongoid.logger
90
91
  coll.drop_index(name)
91
92
  end
92
93
  end
@@ -96,9 +97,9 @@ module Mongoid::FullTextSearch
96
97
  index_definition = [['ngram', Mongo::ASCENDING], ['score', Mongo::DESCENDING]].concat(filter_indexes)
97
98
  end
98
99
 
99
- Mongoid.logger.info "Ensuring fts_index on #{coll.name}: #{index_definition}"
100
+ Mongoid.logger.info "Ensuring fts_index on #{coll.name}: #{index_definition}" if Mongoid.logger
100
101
  coll.ensure_index(index_definition, { :name => 'fts_index' })
101
- Mongoid.logger.info "Ensuring document_id index on #{coll.name}"
102
+ Mongoid.logger.info "Ensuring document_id index on #{coll.name}" if Mongoid.logger
102
103
  coll.ensure_index([['document_id', Mongo::ASCENDING]]) # to make removes fast
103
104
  end
104
105
 
@@ -123,7 +124,7 @@ module Mongoid::FullTextSearch
123
124
  coll = collection.db.collection(index_name)
124
125
  cursors = ngrams.map do |ngram|
125
126
  query = {'ngram' => ngram[0]}
126
- query.update(Hash[options.map { |key,value| [ 'filter_values.%s' % key, { '$all' => [ value ].flatten } ] }])
127
+ query.update(map_query_filters options)
127
128
  count = coll.find(query).count
128
129
  {:ngram => ngram, :count => count, :query => query}
129
130
  end.sort!{ |record1, record2| record1[:count] <=> record2[:count] }
@@ -187,7 +188,7 @@ module Mongoid::FullTextSearch
187
188
  return {} if str.nil?
188
189
 
189
190
  if config[:remove_accents]
190
- str = UnicodeUtils.nfkd(CGI.unescape(str)).gsub(/[^\x00-\x7F]/,'')
191
+ str = UnicodeUtils.nfkd(str).gsub(/[^\x00-\x7F]/,'')
191
192
  end
192
193
 
193
194
  # Remove any characters that aren't in the alphabet and aren't word separators
@@ -268,6 +269,23 @@ module Mongoid::FullTextSearch
268
269
  end
269
270
  end
270
271
 
272
+ private
273
+ # Take a list of filters to be mapped so they can update the query
274
+ # used upon the fulltext search of the ngrams
275
+ def map_query_filters filters
276
+ Hash[filters.map {|key,value|
277
+ case value
278
+ when Hash then
279
+ if value.has_key? :any then format_query_filter('$in',key,value[:any])
280
+ elsif value.has_key? :all then format_query_filter('$all',key,value[:all])
281
+ else raise UnknownFilterQueryOperator, value.keys.join(","), caller end
282
+ else format_query_filter('$all',key,value)
283
+ end
284
+ }]
285
+ end
286
+ def format_query_filter operator, key, value
287
+ ['filter_values.%s' % key, {operator => [value].flatten}]
288
+ end
271
289
  end
272
290
 
273
291
  def update_ngram_index
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "mongoid_fulltext"
8
- s.version = "0.5.7"
8
+ s.version = "0.5.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Aaron Windsor"]
12
- s.date = "2012-01-12"
12
+ s.date = "2012-03-08"
13
13
  s.description = "Full-text search for the Mongoid ORM, using n-grams extracted from text"
14
14
  s.email = "aaron.windsor@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -82,20 +82,20 @@ Gem::Specification.new do |s|
82
82
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
83
83
  s.add_runtime_dependency(%q<unicode_utils>, ["~> 1.0.0"])
84
84
  s.add_development_dependency(%q<mongoid>, ["~> 2.0.0"])
85
- s.add_development_dependency(%q<bson_ext>, ["~> 1.3.0"])
85
+ s.add_development_dependency(%q<bson_ext>, ["~> 1.5.2"])
86
86
  s.add_development_dependency(%q<rspec>, ["~> 2.5.0"])
87
87
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
88
88
  else
89
89
  s.add_dependency(%q<unicode_utils>, ["~> 1.0.0"])
90
90
  s.add_dependency(%q<mongoid>, ["~> 2.0.0"])
91
- s.add_dependency(%q<bson_ext>, ["~> 1.3.0"])
91
+ s.add_dependency(%q<bson_ext>, ["~> 1.5.2"])
92
92
  s.add_dependency(%q<rspec>, ["~> 2.5.0"])
93
93
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
94
94
  end
95
95
  else
96
96
  s.add_dependency(%q<unicode_utils>, ["~> 1.0.0"])
97
97
  s.add_dependency(%q<mongoid>, ["~> 2.0.0"])
98
- s.add_dependency(%q<bson_ext>, ["~> 1.3.0"])
98
+ s.add_dependency(%q<bson_ext>, ["~> 1.5.2"])
99
99
  s.add_dependency(%q<rspec>, ["~> 2.5.0"])
100
100
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
101
101
  end
@@ -1,10 +1,12 @@
1
1
  class FilteredArtwork
2
2
  include Mongoid::Document
3
3
  include Mongoid::FullTextSearch
4
- field :title
4
+ field :title, type: String
5
+ field :colors, type: Array, default: []
5
6
  fulltext_search_in :title, :index_name => 'mongoid_fulltext.artworks_and_artists',
6
7
  :filters => { :is_foobar => lambda { |x| x.title == 'foobar' },
7
8
  :is_artwork => lambda { |x| true },
8
- :is_artist => lambda { |x| false }
9
+ :is_artist => lambda { |x| false },
10
+ :colors? => lambda { |x| x.colors }
9
11
  }
10
12
  end
@@ -29,16 +29,28 @@ module Mongoid
29
29
  let!(:lowered) { BasicArtwork.create(:title => 'Lowered') }
30
30
  let!(:cookies) { BasicArtwork.create(:title => 'Cookies') }
31
31
  let!(:empty) { BasicArtwork.create(:title => '') }
32
- let!(:cesar) { BasicArtwork.create(:title => "C\u00e9sar Galicia") }
33
- let!(:julio) { BasicArtwork.create(:title => "Julio Cesar Morales") }
34
- let!(:csar) { BasicArtwork.create(:title => "Csar") }
35
-
32
+ let!(:cesar) { BasicArtwork.create(:title => "C\u00e9sar Galicia") }
33
+ let!(:julio) { BasicArtwork.create(:title => "Julio Cesar Morales") }
34
+ let!(:csar) { BasicArtwork.create(:title => "Csar") }
35
+ let!(:percent) { BasicArtwork.create(:title => "Untitled (cal%desert)") }
36
+
37
+ it "returns empty for empties" do
38
+ BasicArtwork.fulltext_search(nil, :max_results => 1).should == []
39
+ BasicArtwork.fulltext_search("", :max_results => 1).should == []
40
+ end
41
+
42
+ it "finds percents" do
43
+ BasicArtwork.fulltext_search("cal%desert".force_encoding("ASCII-8BIT"), :max_results => 1).first.should == percent
44
+ BasicArtwork.fulltext_search("cal%desert".force_encoding("UTF-8"), :max_results => 1).first.should == percent
45
+ end
46
+
36
47
  it "forgets accents" do
37
48
  BasicArtwork.fulltext_search('cesar', :max_results => 1).first.should == cesar
38
49
  BasicArtwork.fulltext_search('cesar g', :max_results => 1).first.should == cesar
39
50
  BasicArtwork.fulltext_search("C\u00e9sar", :max_results => 1).first.should == cesar
40
- BasicArtwork.fulltext_search("C\303\251sar", :max_results => 1).first.should == cesar
41
- BasicArtwork.fulltext_search("c%C3%A9sar".encode("ASCII-8BIT"), :max_results => 1).first.should == cesar
51
+ BasicArtwork.fulltext_search("C\303\251sar".force_encoding("UTF-8"), :max_results => 1).first.should == cesar
52
+ BasicArtwork.fulltext_search(CGI.unescape("c%C3%A9sar"), :max_results => 1).first.should == cesar
53
+ BasicArtwork.fulltext_search(CGI.unescape("c%C3%A9sar".encode("ASCII-8BIT")), :max_results => 1).first.should == cesar
42
54
  end
43
55
 
44
56
  it "returns exact matches" do
@@ -370,9 +382,10 @@ module Mongoid
370
382
  ngram_indexes.length.should == 1
371
383
  keys = ngram_indexes.first[1]['key'].keys
372
384
  expected_keys = ['ngram','score', 'filter_values.is_fuzzy', 'filter_values.is_awesome',
373
- 'filter_values.is_foobar', 'filter_values.is_artwork', 'filter_values.is_artist'].sort
385
+ 'filter_values.is_foobar', 'filter_values.is_artwork', 'filter_values.is_artist', 'filter_values.colors?'].sort
374
386
  keys.sort.should == expected_keys
375
387
  end
388
+
376
389
  end
377
390
 
378
391
  context "with partitions applied to a model" do
@@ -639,32 +652,18 @@ module Mongoid
639
652
  # but mongo will automatically attempt to index _id in the background
640
653
  Mongoid.master["mongoid_fulltext.index_basicartwork_0"].index_information.size.should <= 1
641
654
  BasicArtwork.create_indexes
642
- Mongoid.master["mongoid_fulltext.index_basicartwork_0"].index_information.should ==
643
- {
644
- "_id_" => {
645
- "name" => "_id_",
646
- "ns" => "mongoid_fulltext_test.mongoid_fulltext.index_basicartwork_0",
647
- "key" => { "_id" => 1 },
648
- "v" => 0
649
- },
650
- "fts_index" => {
651
- "name" => "fts_index",
652
- "ns" => "mongoid_fulltext_test.mongoid_fulltext.index_basicartwork_0",
653
- "key" => { "ngram" => 1, "score" => -1 },
654
- "v" => 0
655
- },
656
- "document_id_1" => {
657
- "name" => "document_id_1",
658
- "ns" => "mongoid_fulltext_test.mongoid_fulltext.index_basicartwork_0",
659
- "key" => { "document_id" => 1 },
660
- "v"=>0
661
- }
662
- }
655
+ expected_indexes = ['_id_', 'fts_index', 'document_id_1'].sort
656
+ Mongoid.master["mongoid_fulltext.index_basicartwork_0"].index_information.keys.sort.should == expected_indexes
663
657
  end
664
658
 
665
659
  it "doesn't fail on models that don't have a fulltext index" do
666
660
  lambda { HiddenDragon.create_indexes }.should_not raise_error
667
661
  end
662
+
663
+ it "doesn't blow up when the Mongoid.logger is set to false" do
664
+ Mongoid.logger = false
665
+ BasicArtwork.create_indexes
666
+ end
668
667
 
669
668
  end
670
669
 
@@ -680,5 +679,100 @@ module Mongoid
680
679
  end
681
680
  end
682
681
 
682
+ # For =~ operator documentation
683
+ # https://github.com/dchelimsky/rspec/blob/master/lib/spec/matchers/match_array.rb#L53
684
+
685
+ context "with artwork that returns an array of colors as a filter" do
686
+ let!(:title) {"title"}
687
+ let!(:nomatch) {"nomatch"}
688
+ let!(:red) {"red"}
689
+ let!(:green) {"green"}
690
+ let!(:blue) {"blue"}
691
+ let!(:yellow) {"yellow"}
692
+ let!(:brown) {"brown"}
693
+
694
+ let!(:rgb_artwork) {FilteredArtwork.create(:title => "#{title} rgb", :colors => [red,green,blue])}
695
+ let!(:holiday_artwork) {FilteredArtwork.create(:title => "#{title} holiday", :colors => [red,green])}
696
+ let!(:aqua_artwork) {FilteredArtwork.create(:title => "#{title} aqua", :colors => [green,blue])}
697
+
698
+ context "with a fulltext search passing red, green, and blue to the colors filter" do
699
+ it "should return the rgb artwork" do
700
+ FilteredArtwork.fulltext_search(title, :colors? => [red,green,blue]).should == [rgb_artwork]
701
+ end
702
+ end
703
+
704
+ context "with a fulltext search passing blue and red to the colors filter" do
705
+ it "should return the rgb artwork" do
706
+ FilteredArtwork.fulltext_search(title, :colors? => [blue,red]).should == [rgb_artwork]
707
+ end
708
+ end
709
+
710
+ context "with a fulltext search passing green to the colors filter" do
711
+ it "should return all artwork" do
712
+ FilteredArtwork.fulltext_search(title, :colors? => [green]).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
713
+ end
714
+ end
715
+
716
+ context "with a fulltext search passing no colors to the filter" do
717
+ it "should return all artwork" do
718
+ FilteredArtwork.fulltext_search(title).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
719
+ end
720
+ end
721
+
722
+ context "with a fulltext search passing green and yellow to the colors filter" do
723
+ it "should return no artwork" do
724
+ FilteredArtwork.fulltext_search(title, :colors? => [green,yellow]).should == []
725
+ end
726
+ end
727
+
728
+ context "with the query operator overridden to use $in instead of the default $all" do
729
+ context "with a fulltext search passing green and yellow to the colors filter" do
730
+ it "should return all of the artwork" do
731
+ FilteredArtwork.fulltext_search(title, :colors? => {:any => [green,yellow]}).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
732
+ end
733
+ end
734
+
735
+ context "with a fulltext search passing brown and yellow to the colors filter" do
736
+ it "should return none of the artwork" do
737
+ FilteredArtwork.fulltext_search(title, :colors? => {:any => [brown,yellow]}).should == []
738
+ end
739
+ end
740
+
741
+ context "with a fulltext search passing blue to the colors filter" do
742
+ it "should return the rgb and aqua artwork" do
743
+ FilteredArtwork.fulltext_search(title, :colors? => {:any => [blue]}).should == [rgb_artwork,aqua_artwork]
744
+ end
745
+ end
746
+
747
+ context "with a fulltext search term that won't match" do
748
+ it "should return none of the artwork" do
749
+ FilteredArtwork.fulltext_search(nomatch, :colors? => {:any => [green,yellow]}).should == []
750
+ end
751
+ end
752
+ end
753
+
754
+ context "with the query operator overridden to use $all" do
755
+ context "with a fulltext search passing red, green, and blue to the colors filter" do
756
+ it "should return the rgb artwork" do
757
+ FilteredArtwork.fulltext_search(title, :colors? => {:all => [red,green,blue]}).should == [rgb_artwork]
758
+ end
759
+ end
760
+
761
+ context "with a fulltext search passing green to the colors filter" do
762
+ it "should return all artwork" do
763
+ FilteredArtwork.fulltext_search(title, :colors? => {:all => [green]}).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
764
+ end
765
+ end
766
+ end
767
+
768
+ context "with an unknown query operator used to override the default $all" do
769
+ context "with a fulltext search passing red, green, and blue to the colors filter" do
770
+ it "should raise an error" do
771
+ -> {FilteredArtwork.fulltext_search(title, :colors? => {:unknown => [red,green,blue]})}.should raise_error(Mongoid::FullTextSearch::UnknownFilterQueryOperator)
772
+ end
773
+ end
774
+ end
775
+ end
776
+
683
777
  end
684
778
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_fulltext
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-12 00:00:00.000000000Z
12
+ date: 2012-03-08 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: unicode_utils
16
- requirement: &2154109500 !ruby/object:Gem::Requirement
16
+ requirement: &2165513880 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2154109500
24
+ version_requirements: *2165513880
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mongoid
27
- requirement: &2154107440 !ruby/object:Gem::Requirement
27
+ requirement: &2165513400 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,21 +32,21 @@ dependencies:
32
32
  version: 2.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2154107440
35
+ version_requirements: *2165513400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bson_ext
38
- requirement: &2154105600 !ruby/object:Gem::Requirement
38
+ requirement: &2165512920 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
42
42
  - !ruby/object:Gem::Version
43
- version: 1.3.0
43
+ version: 1.5.2
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2154105600
46
+ version_requirements: *2165512920
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &2154103900 !ruby/object:Gem::Requirement
49
+ requirement: &2165512440 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.5.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2154103900
57
+ version_requirements: *2165512440
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &2154099020 !ruby/object:Gem::Requirement
60
+ requirement: &2165511960 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 1.5.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2154099020
68
+ version_requirements: *2165511960
69
69
  description: Full-text search for the Mongoid ORM, using n-grams extracted from text
70
70
  email: aaron.windsor@gmail.com
71
71
  executables: []
@@ -119,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
119
  version: '0'
120
120
  segments:
121
121
  - 0
122
- hash: 2225884234054153231
122
+ hash: -3796604883696425002
123
123
  required_rubygems_version: !ruby/object:Gem::Requirement
124
124
  none: false
125
125
  requirements: