diff --git a/lib/redmine/search.rb b/lib/redmine/search.rb index c07f93aad..6c3ee835c 100644 --- a/lib/redmine/search.rb +++ b/lib/redmine/search.rb @@ -135,7 +135,11 @@ module Redmine def tokens # extract tokens from the question # eg. hello "bye bye" => ["hello", "bye bye"] - tokens = @question.scan(%r{(([[:space:]]|^)"[^"]+"([[:space:]]|$)|[[:^space:]]+)}).collect {|m| m.first.gsub(%r{(^[[:space:]]*"[[:space:]]*|[[:space:]]*"[[:space:]]*$)}, '')} + tokens = @question.scan(/"[^"]+"|[^\p{Zs}]+/).map do |token| + # Remove quotes from quoted tokens, strip surrounding whitespace + # e.g. "\" foo bar \"" => "foo bar" + token.gsub(/\A"\p{Zs}*|\p{Zs}*"\Z/, '') + end # tokens must be at least 2 characters long # but for Chinese characters (Chinese HANZI/Japanese KANJI), tokens can be one character # no more than 5 tokens to search for diff --git a/test/unit/lib/redmine/search_test.rb b/test/unit/lib/redmine/search_test.rb index 72cf14492..e2d77cca0 100644 --- a/test/unit/lib/redmine/search_test.rb +++ b/test/unit/lib/redmine/search_test.rb @@ -30,4 +30,9 @@ class Redmine::Search::Tokenize < ActiveSupport::TestCase value = "全角\u3000スペース" assert_equal %w[全角 スペース], Redmine::Search::Tokenizer.new(value).tokens end + + def test_tokenize_should_support_multiple_phrases + value = '"phrase one" "phrase two"' + assert_equal ["phrase one", "phrase two"], Redmine::Search::Tokenizer.new(value).tokens + end end