You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2023/03/13 12:40:10 UTC

[lucene] branch branch_9x updated: Fix boost missing in MultiFieldQueryParser (#12202)

This is an automated email from the ASF dual-hosted git repository.

rmuir pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new f5d1e1c787c Fix boost missing in MultiFieldQueryParser (#12202)
f5d1e1c787c is described below

commit f5d1e1c787c50eb2649a3dad1b92e4def2636708
Author: Jasir KT <me...@gmail.com>
AuthorDate: Mon Mar 13 17:57:42 2023 +0530

    Fix boost missing in MultiFieldQueryParser (#12202)
    
    When using boost along with any of fuzzy, wildcard, regexp, range or prefix queries, the boost is not applied.
---
 lucene/CHANGES.txt                                 |  2 ++
 .../queryparser/classic/MultiFieldQueryParser.java | 25 +++++++++++++++++-----
 .../classic/TestMultiFieldQueryParser.java         | 20 +++++++++++++++++
 3 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index c17eec1ea0c..68281700e81 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -71,6 +71,8 @@ Bug Fixes
 
 * GITHUB#12196: Fix MultiFieldQueryParser to handle both query boost and phrase slop at the same time.  (Jasir KT)
 
+* GITHUB#12202: Fix MultiFieldQueryParser to apply boosts to regexp, wildcard, prefix, range, fuzzy queries.  (Jasir KT)
+
 Build
 ---------------------
 
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
index e2c9802935f..66d0787552c 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
@@ -132,6 +132,16 @@ public class MultiFieldQueryParser extends QueryParser {
     return q;
   }
 
+  private Query applyBoost(Query q, String field) {
+    if (boosts != null) {
+      Float boost = boosts.get(field);
+      if (boost != null) {
+        q = new BoostQuery(q, boost);
+      }
+    }
+    return q;
+  }
+
   @Override
   protected Query getFieldQuery(String field, String queryText, boolean quoted)
       throws ParseException {
@@ -205,7 +215,8 @@ public class MultiFieldQueryParser extends QueryParser {
       }
       return getMultiFieldQuery(clauses);
     }
-    return super.getFuzzyQuery(field, termStr, minSimilarity);
+    Query q = super.getFuzzyQuery(field, termStr, minSimilarity);
+    return applyBoost(q, field);
   }
 
   @Override
@@ -217,7 +228,8 @@ public class MultiFieldQueryParser extends QueryParser {
       }
       return getMultiFieldQuery(clauses);
     }
-    return super.getPrefixQuery(field, termStr);
+    Query q = super.getPrefixQuery(field, termStr);
+    return applyBoost(q, field);
   }
 
   @Override
@@ -229,7 +241,8 @@ public class MultiFieldQueryParser extends QueryParser {
       }
       return getMultiFieldQuery(clauses);
     }
-    return super.getWildcardQuery(field, termStr);
+    Query q = super.getWildcardQuery(field, termStr);
+    return applyBoost(q, field);
   }
 
   @Override
@@ -243,7 +256,8 @@ public class MultiFieldQueryParser extends QueryParser {
       }
       return getMultiFieldQuery(clauses);
     }
-    return super.getRangeQuery(field, part1, part2, startInclusive, endInclusive);
+    Query q = super.getRangeQuery(field, part1, part2, startInclusive, endInclusive);
+    return applyBoost(q, field);
   }
 
   @Override
@@ -255,7 +269,8 @@ public class MultiFieldQueryParser extends QueryParser {
       }
       return getMultiFieldQuery(clauses);
     }
-    return super.getRegexpQuery(field, termStr);
+    Query q = super.getRegexpQuery(field, termStr);
+    return applyBoost(q, field);
   }
 
   /** Creates a multifield query */
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
index ee684c30f85..95e78f3d9dd 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
@@ -161,6 +161,26 @@ public class TestMultiFieldQueryParser extends LuceneTestCase {
     q = mfqp.parse("\"one two\"~2");
     assertEquals("(b:\"one two\"~2)^5.0 (t:\"one two\"~2)^10.0", q.toString());
 
+    // check boost with fuzzy
+    q = mfqp.parse("one~");
+    assertEquals("(b:one~2)^5.0 (t:one~2)^10.0", q.toString());
+
+    // check boost with prefix
+    q = mfqp.parse("one*");
+    assertEquals("(b:one*)^5.0 (t:one*)^10.0", q.toString());
+
+    // check boost with wildcard
+    q = mfqp.parse("o?n*e");
+    assertEquals("(b:o?n*e)^5.0 (t:o?n*e)^10.0", q.toString());
+
+    // check boost with regex
+    q = mfqp.parse("/[a-z][123]/");
+    assertEquals("(b:/[a-z][123]/)^5.0 (t:/[a-z][123]/)^10.0", q.toString());
+
+    // check boost with range
+    q = mfqp.parse("[one TO two]");
+    assertEquals("(b:[one TO two])^5.0 (t:[one TO two])^10.0", q.toString());
+
     q = mfqp.parse("one^3 AND two^4");
     assertEquals("+((b:one)^5.0 (t:one)^10.0)^3.0 +((b:two)^5.0 (t:two)^10.0)^4.0", q.toString());
   }