diff --git a/config/site_settings.yml b/config/site_settings.yml index 0ec95ded873..5fa7c4a256f 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -2192,6 +2192,9 @@ backups: client: true search: + enable_search_prefix_matching: + default: true + hidden: true use_pg_headlines_for_excerpt: default: false hidden: true diff --git a/lib/search.rb b/lib/search.rb index 0429afe2bbd..ab8c6a06aea 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -1237,7 +1237,8 @@ class Search end def self.set_tsquery_weight_filter(term, weight_filter) - "'#{self.escape_string(term)}':*#{weight_filter}" + optional_star = SiteSetting.enable_search_prefix_matching ? "*" : "" + "'#{self.escape_string(term)}':#{optional_star}#{weight_filter}" end def self.escape_string(term) diff --git a/spec/lib/search_spec.rb b/spec/lib/search_spec.rb index 4388a13ebde..be7c0c3ec78 100644 --- a/spec/lib/search_spec.rb +++ b/spec/lib/search_spec.rb @@ -2580,4 +2580,25 @@ RSpec.describe Search do expect(result.categories.length).to eq(0) end end + + context "when enable_search_prefix_matching is disabled" do + before do + SearchIndexer.enable + SiteSetting.enable_search_prefix_matching = false + end + + fab!(:post) do + Fabricate(:post, topic: topic, raw: "this body of the post contains abracadabra") + end + + it "omits prefix search results" do + SearchIndexer.index(post, force: true) + + result = Search.execute("abra") + expect(result.posts.length).to eq(0) + + result = Search.execute("abracadabra") + expect(result.posts.length).to eq(1) + end + end end