diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index 0a9e69a..890eeb1 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -284,6 +284,7 @@ module Searchkick shared_options[:operator] = operator if match_type == :match exclude_analyzer = nil + exclude_field = field if field == "_all" || field.end_with?(".analyzed") shared_options[:cutoff_frequency] = 0.001 unless operator == "and" || misspellings == false @@ -295,6 +296,8 @@ module Searchkick elsif field.end_with?(".exact") f = field.split(".")[0..-2].join(".") queries_to_add << {match: {f => shared_options.merge(analyzer: "keyword")}} + exclude_field = f + exclude_analyzer = "keyword" else analyzer = field =~ /\.word_(start|middle|end)\z/ ? "searchkick_word_search" : "searchkick_autocomplete_search" qs << shared_options.merge(analyzer: analyzer) @@ -323,12 +326,12 @@ module Searchkick queries_to_add.concat(q2) end - if options[:exclude] && exclude_analyzer + if options[:exclude] must_not = options[:exclude].map do |phrase| { match_phrase: { - field => { + exclude_field => { query: phrase, analyzer: exclude_analyzer } diff --git a/test/match_test.rb b/test/match_test.rb index 73ca99c..3aeccfc 100644 --- a/test/match_test.rb +++ b/test/match_test.rb @@ -176,6 +176,11 @@ class MatchTest < Minitest::Test assert_search "butter", [], exclude: ["peanut butter"], match: :exact end + def test_exclude_same_exact + store_names ["Butter Tub", "Peanut Butter Tub"] + assert_search "Butter Tub", [], exclude: ["Butter Tub"], match: :exact + end + def test_exclude_egg_word_start store_names ["eggs", "eggplant"] assert_search "egg", ["eggs"], exclude: ["eggplant"], match: :word_start -- libgit2 0.21.0