From 50e52f08745340937e9f679b1a83307bb91484d6 Mon Sep 17 00:00:00 2001 From: Luana Fragoso Date: Tue, 18 Nov 2025 15:13:21 -0800 Subject: [PATCH 1/2] Fix qpm override --- .../search/vectorhighlight/FieldQuery.java | 2 +- .../vectorhighlight/TestFieldQuery.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) 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"); From e0a075d0712c0a5fefa13067927d2009e2208f87 Mon Sep 17 00:00:00 2001 From: Luana Fragoso Date: Mon, 5 Jan 2026 07:51:27 -0800 Subject: [PATCH 2/2] Addressed comments --- lucene/CHANGES.txt | 2 ++ .../vectorhighlight/TestFieldQuery.java | 20 +++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 1c7bffbbc028..356551cf4712 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -112,6 +112,8 @@ Bug Fixes * GITHUB#15125: Handle inconsistent schema on flush with index sorts (Nhat Nguyen) +* GITHUB#15434: Don't override boost of conflicting expanded phrases by taking the max boost in markTerminal for FVHighlighter (Luana Fragoso) + Changes in Runtime Behavior --------------------- * GITHUB#14187: The query cache is now disabled by default. (Adrien Grand) 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 c0d906a1f5e9..5470d0e9b9e8 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 @@ -843,18 +843,18 @@ public void testQueryPhraseMapDuplicate() throws IOException { 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"); + QueryPhraseMap a_qpm = map.get("f").subMap.get("a"); + assertEquals(0, a_qpm.boost, 0.0); + QueryPhraseMap b_qpm = a_qpm.subMap.get("b"); + assertEquals(20, b_qpm.boost, 0.0); + QueryPhraseMap c_qpm = b_qpm.subMap.get("c"); // make sure final boost is from the query and not the expanded boost 1 - assertEquals(100, qpm2.boost, 0.0); + assertEquals(100, c_qpm.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); + b_qpm = map.get("f").subMap.get("b"); + assertEquals(0, b_qpm.boost, 0.0); + c_qpm = b_qpm.subMap.get("c"); + assertEquals(50, c_qpm.boost, 0.0); } public void testSearchPhrase() throws Exception {