Commit 656cc5ddfb8e82f8f16eed3aaa488b813cf2785f

Authored by Andrew Kane
1 parent 4180044a

Added searchable option

@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 2
3 - Added `below` option to misspellings to improve performance 3 - Added `below` option to misspellings to improve performance
4 - Fixed synonyms for `word_*` partial matches 4 - Fixed synonyms for `word_*` partial matches
  5 +- Added `searchable` option
5 - Added `similarity` option 6 - Added `similarity` option
6 - Added `match` option 7 - Added `match` option
7 - Added `word` option 8 - Added `word` option
lib/searchkick/index.rb
@@ -421,7 +421,7 @@ module Searchkick @@ -421,7 +421,7 @@ module Searchkick
421 end 421 end
422 422
423 mapping_options = Hash[ 423 mapping_options = Hash[
424 - [:autocomplete, :suggest, :word, :text_start, :text_middle, :text_end, :word_start, :word_middle, :word_end, :highlight] 424 + [:autocomplete, :suggest, :word, :text_start, :text_middle, :text_end, :word_start, :word_middle, :word_end, :highlight, :searchable]
425 .map { |type| [type, (options[type] || []).map(&:to_s)] } 425 .map { |type| [type, (options[type] || []).map(&:to_s)] }
426 ] 426 ]
427 427
@@ -435,18 +435,20 @@ module Searchkick @@ -435,18 +435,20 @@ module Searchkick
435 } 435 }
436 } 436 }
437 437
438 - if word  
439 - field_mapping[:fields]["analyzed"] = {type: "string", index: "analyzed"}  
440 - end 438 + if !options[:searchable] || mapping_options[:searchable].include?(field)
  439 + if word
  440 + field_mapping[:fields]["analyzed"] = {type: "string", index: "analyzed"}
441 441
442 - mapping_options.except(:highlight).each do |type, fields|  
443 - if options[:match] == type || fields.include?(field)  
444 - field_mapping[:fields][type] = {type: "string", index: "analyzed", analyzer: "searchkick_#{type}_index"} 442 + if mapping_options[:highlight].include?(field)
  443 + field_mapping[:fields]["analyzed"][:term_vector] = "with_positions_offsets"
  444 + end
445 end 445 end
446 - end  
447 446
448 - if word && mapping_options[:highlight].include?(field)  
449 - field_mapping[:fields]["analyzed"][:term_vector] = "with_positions_offsets" 447 + mapping_options.except(:highlight, :searchable).each do |type, fields|
  448 + if options[:match] == type || fields.include?(field)
  449 + field_mapping[:fields][type] = {type: "string", index: "analyzed", analyzer: "searchkick_#{type}_index"}
  450 + end
  451 + end
450 end 452 end
451 453
452 mapping[field] = field_mapping 454 mapping[field] = field_mapping
@@ -475,15 +477,17 @@ module Searchkick @@ -475,15 +477,17 @@ module Searchkick
475 # http://www.elasticsearch.org/guide/reference/mapping/multi-field-type/ 477 # http://www.elasticsearch.org/guide/reference/mapping/multi-field-type/
476 # however, we can include the not_analyzed field in _all 478 # however, we can include the not_analyzed field in _all
477 # and the _all index analyzer will take care of it 479 # and the _all index analyzer will take care of it
478 - "{name}" => {type: "string", index: "not_analyzed"} 480 + "{name}" => {type: "string", index: "not_analyzed", include_in_all: !options[:searchable]}
479 } 481 }
480 482
481 - if options[:match] && options[:match] != :word  
482 - dynamic_fields[options[:match]] = {type: "string", index: "analyzed", analyzer: "searchkick_#{options[:match]}_index"}  
483 - end 483 + unless options[:searchable]
  484 + if options[:match] && options[:match] != :word
  485 + dynamic_fields[options[:match]] = {type: "string", index: "analyzed", analyzer: "searchkick_#{options[:match]}_index"}
  486 + end
484 487
485 - if word  
486 - dynamic_fields["analyzed"] = {type: "string", index: "analyzed"} 488 + if word
  489 + dynamic_fields["analyzed"] = {type: "string", index: "analyzed"}
  490 + end
487 end 491 end
488 492
489 mappings = { 493 mappings = {
test/match_test.rb
@@ -198,6 +198,13 @@ class MatchTest < Minitest::Test @@ -198,6 +198,13 @@ class MatchTest < Minitest::Test
198 assert_search "almond", [] 198 assert_search "almond", []
199 end 199 end
200 200
  201 + def test_unsearchable_where
  202 + store [
  203 + {name: "Unsearchable", description: "Almond"}
  204 + ]
  205 + assert_search "*", ["Unsearchable"], where: {description: "Almond"}
  206 + end
  207 +
201 def test_emoji 208 def test_emoji
202 skip unless defined?(EmojiParser) 209 skip unless defined?(EmojiParser)
203 store_names ["Banana"] 210 store_names ["Banana"]
test/test_helper.rb
@@ -216,7 +216,8 @@ class Product @@ -216,7 +216,8 @@ class Product
216 word_middle: [:name], 216 word_middle: [:name],
217 word_end: [:name], 217 word_end: [:name],
218 highlight: [:name], 218 highlight: [:name],
219 - unsearchable: [:description], 219 + # unsearchable: [:description],
  220 + searchable: [:name, :color],
220 match: ENV["MATCH"] ? ENV["MATCH"].to_sym : nil 221 match: ENV["MATCH"] ? ENV["MATCH"].to_sym : nil
221 222
222 attr_accessor :conversions, :user_ids, :aisle 223 attr_accessor :conversions, :user_ids, :aisle