Skip to content
This repository has been archived by the owner on Oct 5, 2023. It is now read-only.

Commit

Permalink
escape all lucene special characters, remove special case for !, upda…
Browse files Browse the repository at this point in the history
…te unit tests
  • Loading branch information
Dan Dockery committed Nov 11, 2011
1 parent 552d93d commit e84409c
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 25 deletions.
8 changes: 1 addition & 7 deletions lib/elastic_searchable.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -43,13 +43,7 @@ def request(method, url, options = {})
end end


def escape_query(string) def escape_query(string)
q = string.to_s.gsub(/([\(\)\[\]\{\}\?\\\"\\^])/,'\\\\\1') 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
end end


private private
Expand Down
78 changes: 60 additions & 18 deletions test/test_elastic_searchable.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -476,40 +476,82 @@ def self.max_per_page
assert_equal '\!', result assert_equal '\!', result
end end


should "escape two exclamation marks" do should "escape ^" do
queryString = '!!' queryString = '^'
result = ElasticSearchable.escape_query(queryString) result = ElasticSearchable.escape_query(queryString)
assert_equal '\!\!', result assert_equal '\^', result
end end


should "escape five exclamation marks" do should "escape +" do
queryString = '!!!!!' queryString = '+'
result = ElasticSearchable.escape_query(queryString) result = ElasticSearchable.escape_query(queryString)
assert_equal '\!\!\!\!\!', result assert_equal '\+', result
end end


should "leave exlamation at the beginning of a word intact" do should "escape -" do
queryString = '!monkey' queryString = '-'
result = ElasticSearchable.escape_query(queryString) result = ElasticSearchable.escape_query(queryString)
assert_equal '!monkey', result assert_equal '\-', result
end end


should "escape exclamation mark before whitespace" do should "escape (" do
queryString = '! ' queryString = '('
result = ElasticSearchable.escape_query(queryString) result = ElasticSearchable.escape_query(queryString)
assert_equal '\! ', result assert_equal '\(', result
end end


should "escape exclamation mark before closing parens" do should "escape )" do
queryString = '!)' queryString = ')'
result = ElasticSearchable.escape_query(queryString) result = ElasticSearchable.escape_query(queryString)
assert_equal '\!\)', result assert_equal '\)', result
end end


should "escape ^" do should "escape {" do
queryString = '^' queryString = '}'
result = ElasticSearchable.escape_query(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 end
end end
Expand Down

0 comments on commit e84409c

Please sign in to comment.