diff --git a/lib/pg_search/features/trigram.rb b/lib/pg_search/features/trigram.rb index 80bdfed9..d32062ff 100644 --- a/lib/pg_search/features/trigram.rb +++ b/lib/pg_search/features/trigram.rb @@ -4,7 +4,7 @@ module PgSearch module Features class Trigram < Feature def self.valid_options - super + %i[threshold word_similarity] + super + %i[threshold word_similarity strict_word_similarity] end def conditions @@ -29,23 +29,31 @@ def rank private + def strict_word_similarity? + options[:strict_word_similarity] + end + def word_similarity? options[:word_similarity] end def similarity_function - if word_similarity? - "word_similarity" + if strict_word_similarity? + 'strict_word_similarity' + elsif word_similarity? + 'word_similarity' else - "similarity" + 'similarity' end end def infix_operator - if word_similarity? - "<%" + if strict_word_similarity? + '<<%' + elsif word_similarity? + '<%' else - "%" + '%' end end diff --git a/spec/lib/pg_search/features/trigram_spec.rb b/spec/lib/pg_search/features/trigram_spec.rb index 4dd44eb2..bd619579 100644 --- a/spec/lib/pg_search/features/trigram_spec.rb +++ b/spec/lib/pg_search/features/trigram_spec.rb @@ -50,6 +50,17 @@ end end + context "when searching by strict_word_similarity" do + let(:options) do + {strict_word_similarity: true} + end + + it 'uses the "<<%" operator when searching by word_similarity' do + config.ignore = [] + expect(feature.conditions.to_sql).to eq("('#{query}' <<% (#{coalesced_columns}))") + end + end + context "when ignoring accents" do it "escapes the search document and query, but not the accent function" do config.ignore = [:accents] @@ -81,6 +92,18 @@ ) end end + + context "when searching by strict_word_similarity" do + let(:options) do + {threshold: 0.5, strict_word_similarity: true} + end + + it 'uses a minimum similarity expression instead of the "<<%" operator' do + expect(feature.conditions.to_sql).to eq( + "(strict_word_similarity('#{query}', (#{coalesced_columns})) >= 0.5)" + ) + end + end end context "when only certain columns are selected" do