diff --git a/README.md b/README.md index 2fd6957..72c07c7 100644 --- a/README.md +++ b/README.md @@ -326,7 +326,7 @@ You can also use a Hunspell dictionary for stemming. [master] ```ruby class Product < ApplicationRecord - searchkick language: {type: "hunspell", locale: "en_US"} + searchkick stemmer: {type: "hunspell", locale: "en_US"} end ``` diff --git a/lib/searchkick/index_options.rb b/lib/searchkick/index_options.rb index 25190db..83bb5ec 100644 --- a/lib/searchkick/index_options.rb +++ b/lib/searchkick/index_options.rb @@ -153,11 +153,8 @@ module Searchkick } } - if language.is_a?(Hash) - update_language_type(settings, language) - else - update_language(settings, language) - end + raise ArgumentError, "Can't pass both language and stemmer" if options[:stemmer] && language + update_language(settings, language) update_stemming(settings) if Searchkick.env == "test" @@ -200,16 +197,6 @@ module Searchkick settings end - def update_language_type(settings, language) - case language[:type] - when "hunspell" - # supports all token filter options - settings[:analysis][:filter][:searchkick_stemmer] = language - else - raise ArgumentError, "Unknown language: #{language[:type]}" - end - end - def update_language(settings, language) case language when "chinese" @@ -300,6 +287,18 @@ module Searchkick end def update_stemming(settings) + if options[:stemmer] + stemmer = options[:stemmer] + # could also support snowball and stemmer + case stemmer[:type] + when "hunspell" + # supports all token filter options + settings[:analysis][:filter][:searchkick_stemmer] = stemmer + else + raise ArgumentError, "Unknown stemmer: #{stemmer[:type]}" + end + end + stem = options[:stem] # language analyzer used diff --git a/lib/searchkick/model.rb b/lib/searchkick/model.rb index fbf74a3..fe8d14e 100644 --- a/lib/searchkick/model.rb +++ b/lib/searchkick/model.rb @@ -6,7 +6,7 @@ module Searchkick unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :case_sensitive, :conversions, :deep_paging, :default_fields, :filterable, :geo_shape, :highlight, :ignore_above, :index_name, :index_prefix, :inheritance, :language, :locations, :mappings, :match, :merge_mappings, :routing, :searchable, :search_synonyms, :settings, :similarity, - :special_characters, :stem, :stem_conversions, :stem_exclusion, :stemmer_override, :suggest, :synonyms, :text_end, + :special_characters, :stem, :stemmer, :stem_conversions, :stem_exclusion, :stemmer_override, :suggest, :synonyms, :text_end, :text_middle, :text_start, :word, :wordnet, :word_end, :word_middle, :word_start] raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any? diff --git a/test/language_test.rb b/test/language_test.rb index c6ba326..ec9b7a3 100644 --- a/test/language_test.rb +++ b/test/language_test.rb @@ -90,21 +90,31 @@ class LanguageTest < Minitest::Test end end - def test_hunspell + def test_stemmer_hunspell skip if ci? - with_options({language: {type: "hunspell", locale: "en_US"}}) do + with_options({stemmer: {type: "hunspell", locale: "en_US"}}) do store_names ["the foxes jumping quickly"] assert_language_search "fox", ["the foxes jumping quickly"] end end - def test_unknown_type + def test_stemmer_unknown_type error = assert_raises(ArgumentError) do - with_options({language: {type: "bad"}}) do + with_options({stemmer: {type: "bad"}}) do end end - assert_equal "Unknown language: bad", error.message + assert_equal "Unknown stemmer: bad", error.message + end + + def test_stemmer_language + skip if ci? + + error = assert_raises(ArgumentError) do + with_options({stemmer: {type: "hunspell", locale: "en_US"}, language: "english"}) do + end + end + assert_equal "Can't pass both language and stemmer", error.message end def assert_language_search(term, expected) -- libgit2 0.21.0