diff --git a/src/main/java/org/codelibs/fess/helper/ViewHelper.java b/src/main/java/org/codelibs/fess/helper/ViewHelper.java index fce54f741..8d636301f 100644 --- a/src/main/java/org/codelibs/fess/helper/ViewHelper.java +++ b/src/main/java/org/codelibs/fess/helper/ViewHelper.java @@ -35,6 +35,7 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; @@ -156,19 +157,15 @@ public class ViewHelper { } return getQuerySet().map( querySet -> { - String t = value; - for (final String query : querySet) { - final String target = LaFunctions.h(query); - final Matcher matcher = - Pattern.compile(target, Pattern.LITERAL | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE).matcher(t); - final StringBuffer buf = new StringBuffer(t.length() + 100); - while (matcher.find()) { - matcher.appendReplacement(buf, highlightTagPre + matcher.group(0) + highlightTagPost); - } - matcher.appendTail(buf); - t = buf.toString(); + final Matcher matcher = + Pattern.compile(querySet.stream().map(LaFunctions::h).map(Pattern::quote).collect(Collectors.joining("|")), + Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE).matcher(value); + final StringBuffer buf = new StringBuffer(value.length() + 100); + while (matcher.find()) { + matcher.appendReplacement(buf, highlightTagPre + matcher.group(0) + highlightTagPost); } - return t; + matcher.appendTail(buf); + return buf.toString(); }).orElse(value); } diff --git a/src/test/java/org/codelibs/fess/helper/ViewHelperTest.java b/src/test/java/org/codelibs/fess/helper/ViewHelperTest.java index d2166006c..db35771ae 100644 --- a/src/test/java/org/codelibs/fess/helper/ViewHelperTest.java +++ b/src/test/java/org/codelibs/fess/helper/ViewHelperTest.java @@ -209,6 +209,10 @@ public class ViewHelperTest extends UnitFessTestCase { text = "1ABC2"; queries = new String[] { "abc" }; assertEquals("1abc2", viewHelper.replaceHighlightQueries(text, queries)); + + text = "abc on exy"; + queries = new String[] { "on" }; + assertEquals("abc on exy", viewHelper.replaceHighlightQueries(text, queries)); } public void test_escapeHighlight() { @@ -324,5 +328,10 @@ public class ViewHelperTest extends UnitFessTestCase { document.put("title", "111AaA222bbb"); assertEquals("111AaA222bbb", viewHelper.getContentTitle(document)); + + querySet.add("on"); + document.put("title", "on 111 strong on aaaa"); + assertEquals("on 111 strong on aaaa", + viewHelper.getContentTitle(document)); } }