浏览代码

add PhraseQuery

Shinsuke Sugaya 9 年之前
父节点
当前提交
acb5f75ee6
共有 1 个文件被更改,包括 17 次插入0 次删除
  1. 17 0
      src/main/java/org/codelibs/fess/helper/QueryHelper.java

+ 17 - 0
src/main/java/org/codelibs/fess/helper/QueryHelper.java

@@ -41,6 +41,7 @@ import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.FuzzyQuery;
 import org.apache.lucene.search.FuzzyQuery;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.PhraseQuery;
 import org.apache.lucene.search.PrefixQuery;
 import org.apache.lucene.search.PrefixQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TermQuery;
@@ -270,6 +271,8 @@ public class QueryHelper implements Serializable {
             return convertTermQuery(context, (TermQuery) query);
             return convertTermQuery(context, (TermQuery) query);
         } else if (query instanceof TermRangeQuery) {
         } else if (query instanceof TermRangeQuery) {
             return convertTermRangeQuery(context, (TermRangeQuery) query);
             return convertTermRangeQuery(context, (TermRangeQuery) query);
+        } else if (query instanceof PhraseQuery) {
+            return convertPhraseQuery(context, (PhraseQuery) query);
         } else if (query instanceof FuzzyQuery) {
         } else if (query instanceof FuzzyQuery) {
             return convertFuzzyQuery(context, (FuzzyQuery) query);
             return convertFuzzyQuery(context, (FuzzyQuery) query);
         } else if (query instanceof PrefixQuery) {
         } else if (query instanceof PrefixQuery) {
@@ -437,6 +440,20 @@ public class QueryHelper implements Serializable {
         }
         }
     }
     }
 
 
+    private QueryBuilder convertPhraseQuery(QueryContext context, PhraseQuery query) {
+        Term[] terms = query.getTerms();
+        if (terms.length == 0) {
+            throw new InvalidQueryException(messages -> messages.addErrorsInvalidQueryUnknown(ActionMessages.GLOBAL_PROPERTY_KEY),
+                    "Unknown phrase query: " + query);
+        }
+        final String field = terms[0].field();
+        final String[] texts = StreamUtil.of(terms).map(term -> term.text()).toArray(n -> new String[n]);
+        final String text = String.join(" ", texts);
+        context.addFieldLog(field, text);
+        StreamUtil.of(texts).forEach(t -> context.addHighlightedQuery(t));
+        return buildDefaultQueryBuilder((f, b) -> QueryBuilders.matchPhraseQuery(f, text).boost(b));
+    }
+
     private boolean isSearchField(final String field) {
     private boolean isSearchField(final String field) {
         for (final String searchField : searchFields) {
         for (final String searchField : searchFields) {
             if (searchField.equals(field)) {
             if (searchField.equals(field)) {