diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 60399788ca64..a9cba0e997b2 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -73,6 +73,8 @@ Optimizations * GITHUB#14268: PointInSetQuery early exit on non-matching segments. (hanbj) +* GITHUB#14425: KeywordField.newSetQuery() reuses prefixed terms (Mikhail Khludnev) + Bug Fixes --------------------- (No changes) diff --git a/lucene/core/src/java/org/apache/lucene/document/KeywordField.java b/lucene/core/src/java/org/apache/lucene/document/KeywordField.java index 31159cc53842..2ed22b2e1413 100644 --- a/lucene/core/src/java/org/apache/lucene/document/KeywordField.java +++ b/lucene/core/src/java/org/apache/lucene/document/KeywordField.java @@ -22,7 +22,6 @@ import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.Term; import org.apache.lucene.search.ConstantScoreQuery; -import org.apache.lucene.search.IndexOrDocValuesQuery; import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.SortField; @@ -175,9 +174,8 @@ public static Query newExactQuery(String field, String value) { public static Query newSetQuery(String field, Collection values) { Objects.requireNonNull(field, "field must not be null"); Objects.requireNonNull(values, "values must not be null"); - Query indexQuery = new TermInSetQuery(field, values); - Query dvQuery = new TermInSetQuery(MultiTermQuery.DOC_VALUES_REWRITE, field, values); - return new IndexOrDocValuesQuery(indexQuery, dvQuery); + return TermInSetQuery.newIndexOrDocValuesQuery( + MultiTermQuery.CONSTANT_SCORE_BLENDED_REWRITE, field, values); } /** diff --git a/lucene/core/src/java/org/apache/lucene/search/TermInSetQuery.java b/lucene/core/src/java/org/apache/lucene/search/TermInSetQuery.java index c82df0ac1ebe..4c8f4c9b62ec 100644 --- a/lucene/core/src/java/org/apache/lucene/search/TermInSetQuery.java +++ b/lucene/core/src/java/org/apache/lucene/search/TermInSetQuery.java @@ -84,8 +84,30 @@ public TermInSetQuery(RewriteMethod rewriteMethod, String field, Collection terms) { + PrefixCodedTerms packed = packTerms(field, terms); + Query indexQuery = new TermInSetQuery(indexRewriteMethod, field, packed); + Query dvQuery = new TermInSetQuery(MultiTermQuery.DOC_VALUES_REWRITE, field, packed); + return new IndexOrDocValuesQuery(indexQuery, dvQuery); + } + private TermInSetQuery(String field, PrefixCodedTerms termData) { - super(field, MultiTermQuery.CONSTANT_SCORE_BLENDED_REWRITE); + this(MultiTermQuery.CONSTANT_SCORE_BLENDED_REWRITE, field, termData); + } + + private TermInSetQuery(RewriteMethod rewrite, String field, PrefixCodedTerms termData) { + super(field, rewrite); this.field = field; this.termData = termData; termDataHashCode = termData.hashCode();