diff --git a/lib/elastic_searchable.rb b/lib/elastic_searchable.rb index 646430a..52c649b 100644 --- a/lib/elastic_searchable.rb +++ b/lib/elastic_searchable.rb @@ -43,13 +43,7 @@ def request(method, url, options = {}) end def escape_query(string) - q = string.to_s.gsub(/([\(\)\[\]\{\}\?\\\"\\^])/,'\\\\\1') - # escape any exclamation marks followed by whitespace or the end of the string - # lucene will interpret exclamation marks as a negation operator - # This should allow users to continue to use ! for negation while avoiding most errors - q.gsub!(/!(!|\s|\z|\\\))/, '\\!\1') - q.gsub!('!!','!\\!') - q + string.to_s.gsub(/([\(\)\[\]\{\}\?\\\"!\^\+\-\*:~])/,'\\\\\1') end private diff --git a/test/test_elastic_searchable.rb b/test/test_elastic_searchable.rb index b65f5e7..61956e7 100644 --- a/test/test_elastic_searchable.rb +++ b/test/test_elastic_searchable.rb @@ -476,40 +476,82 @@ def self.max_per_page assert_equal '\!', result end - should "escape two exclamation marks" do - queryString = '!!' + should "escape ^" do + queryString = '^' result = ElasticSearchable.escape_query(queryString) - assert_equal '\!\!', result + assert_equal '\^', result end - should "escape five exclamation marks" do - queryString = '!!!!!' + should "escape +" do + queryString = '+' result = ElasticSearchable.escape_query(queryString) - assert_equal '\!\!\!\!\!', result + assert_equal '\+', result end - should "leave exlamation at the beginning of a word intact" do - queryString = '!monkey' + should "escape -" do + queryString = '-' result = ElasticSearchable.escape_query(queryString) - assert_equal '!monkey', result + assert_equal '\-', result end - should "escape exclamation mark before whitespace" do - queryString = '! ' + should "escape (" do + queryString = '(' result = ElasticSearchable.escape_query(queryString) - assert_equal '\! ', result + assert_equal '\(', result end - should "escape exclamation mark before closing parens" do - queryString = '!)' + should "escape )" do + queryString = ')' result = ElasticSearchable.escape_query(queryString) - assert_equal '\!\)', result + assert_equal '\)', result end - should "escape ^" do - queryString = '^' + should "escape {" do + queryString = '}' result = ElasticSearchable.escape_query(queryString) - assert_equal '\^', result + assert_equal '\}', result + end + + should "escape [" do + queryString = '[' + result = ElasticSearchable.escape_query(queryString) + assert_equal '\[', result + end + + should "escape ]" do + queryString = ']' + result = ElasticSearchable.escape_query(queryString) + assert_equal '\]', result + end + + should 'escape "' do + queryString = '"' + result = ElasticSearchable.escape_query(queryString) + assert_equal '\"', result + end + + should "escape ~" do + queryString = '~' + result = ElasticSearchable.escape_query(queryString) + assert_equal '\~', result + end + + should "escape *" do + queryString = '*' + result = ElasticSearchable.escape_query(queryString) + assert_equal '\*', result + end + + should "escape :" do + queryString = ':' + result = ElasticSearchable.escape_query(queryString) + assert_equal '\:', result + end + + should "escape ?" do + queryString = '?' + result = ElasticSearchable.escape_query(queryString) + assert_equal '\?', result end end end