diff --git a/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java b/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java index fa489843beb1..3c44379c544c 100644 --- a/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java +++ b/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FieldQuery.java @@ -429,7 +429,7 @@ private void markTerminal(float boost) { private void markTerminal(int slop, float boost) { this.terminal = true; this.slop = slop; - this.boost = boost; + this.boost = Math.max(this.boost, boost); this.termOrPhraseNumber = fieldQuery.nextTermOrPhraseNumber(); } diff --git a/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/TestFieldQuery.java b/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/TestFieldQuery.java index 6538c0d2985f..c0d906a1f5e9 100644 --- a/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/TestFieldQuery.java +++ b/lucene/highlighter/src/test/org/apache/lucene/search/vectorhighlight/TestFieldQuery.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -814,6 +815,48 @@ public void testQueryPhraseMapOverlap2gram() throws Exception { assertEquals(0, qpm2.subMap.size()); } + public void testQueryPhraseMapDuplicate() throws IOException { + BooleanQuery.Builder query = new BooleanQuery.Builder(); + Query bq = toPhraseQuery(analyze("a b c", F, analyzerB), F); + bq = new BoostQuery(bq, 100); + query.add(bq, Occur.SHOULD); + + bq = toPhraseQuery(analyze("a b", F, analyzerB), F); + bq = new BoostQuery(bq, 20); + query.add(bq, Occur.SHOULD); + + bq = toPhraseQuery(analyze("b c", F, analyzerB), F); + bq = new BoostQuery(bq, 50); + query.add(bq, Occur.SHOULD); + + bq = query.build(); + FieldQuery fq = new FieldQuery(bq, true, true); + Set flatQueries = new LinkedHashSet<>(); + fq.flatten(bq, searcher, flatQueries, 1f); + + assertCollectionQueries( + fq.expand(flatQueries), + pqF(100, "a", "b", "c"), + pqF(20, "a", "b"), + // "a b c": 1 -> expanded from "a b" + "b c" + new BoostQuery(pqF(1f, "a", "b", "c"), 1f), + pqF(50, "b", "c")); + + Map map = fq.rootMaps; + QueryPhraseMap qpm = map.get("f").subMap.get("a"); + assertEquals(0, qpm.boost, 0.0); + QueryPhraseMap qpm1 = qpm.subMap.get("b"); + assertEquals(20, qpm1.boost, 0.0); + QueryPhraseMap qpm2 = qpm1.subMap.get("c"); + // make sure final boost is from the query and not the expanded boost 1 + assertEquals(100, qpm2.boost, 0.0); + + QueryPhraseMap qpm3 = map.get("f").subMap.get("b"); + assertEquals(0, qpm3.boost, 0.0); + QueryPhraseMap qpm4 = qpm3.subMap.get("c"); + assertEquals(50, qpm4.boost, 0.0); + } + public void testSearchPhrase() throws Exception { Query query = pqF("a", "b", "c");