diff --git a/CHANGELOG.md b/CHANGELOG.md index ea70a0c..87ca1db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Fixed bug with text values longer than 256 characters and `_all` field - see [#850](https://github.com/ankane/searchkick/issues/850) - Fixed issue with `_all` field in `searchable` +- Fixed `exclude` option with `word_start` ## 2.1.1 diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index b77d355..0a9e69a 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -283,18 +283,22 @@ module Searchkick shared_options[:operator] = operator if match_type == :match + exclude_analyzer = nil + if field == "_all" || field.end_with?(".analyzed") shared_options[:cutoff_frequency] = 0.001 unless operator == "and" || misspellings == false qs.concat [ shared_options.merge(analyzer: "searchkick_search"), shared_options.merge(analyzer: "searchkick_search2") ] + exclude_analyzer = "searchkick_search2" elsif field.end_with?(".exact") f = field.split(".")[0..-2].join(".") queries_to_add << {match: {f => shared_options.merge(analyzer: "keyword")}} else analyzer = field =~ /\.word_(start|middle|end)\z/ ? "searchkick_word_search" : "searchkick_autocomplete_search" qs << shared_options.merge(analyzer: analyzer) + exclude_analyzer = analyzer end if misspellings != false && match_type == :match @@ -319,12 +323,15 @@ module Searchkick queries_to_add.concat(q2) end - if options[:exclude] + if options[:exclude] && exclude_analyzer must_not = options[:exclude].map do |phrase| { match_phrase: { - field => phrase + field => { + query: phrase, + analyzer: exclude_analyzer + } } } end diff --git a/test/match_test.rb b/test/match_test.rb index bfeb4e5..73ca99c 100644 --- a/test/match_test.rb +++ b/test/match_test.rb @@ -161,21 +161,26 @@ class MatchTest < Minitest::Test # butter - def test_butter + def test_exclude_butter store_names ["Butter Tub", "Peanut Butter Tub"] assert_search "butter", ["Butter Tub"], exclude: ["peanut butter"] end - def test_butter_word_start + def test_exclude_butter_word_start store_names ["Butter Tub", "Peanut Butter Tub"] assert_search "butter", ["Butter Tub"], exclude: ["peanut butter"], match: :word_start end - def test_butter_exact + def test_exclude_butter_exact store_names ["Butter Tub", "Peanut Butter Tub"] assert_search "butter", [], exclude: ["peanut butter"], match: :exact end + def test_exclude_egg_word_start + store_names ["eggs", "eggplant"] + assert_search "egg", ["eggs"], exclude: ["eggplant"], match: :word_start + end + # other def test_all -- libgit2 0.21.0