You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2024/11/29 13:49:03 UTC
(lucene) branch main updated: Rewrite queries with no SHOULD clauses and minimumShouldMatch > 0 to a MatchNoDocsQuery.
This is an automated email from the ASF dual-hosted git repository.
jpountz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git
The following commit(s) were added to refs/heads/main by this push:
new 06a320a53e5 Rewrite queries with no SHOULD clauses and minimumShouldMatch > 0 to a MatchNoDocsQuery.
06a320a53e5 is described below
commit 06a320a53e5ed69c382ad31498738b7b13ccfc45
Author: Adrien Grand <jp...@gmail.com>
AuthorDate: Fri Nov 29 14:47:44 2024 +0100
Rewrite queries with no SHOULD clauses and minimumShouldMatch > 0 to a MatchNoDocsQuery.
Closes #14026
---
.../org/apache/lucene/search/BooleanQuery.java | 27 ++++++++++------------
.../apache/lucene/search/TestBooleanRewrites.java | 19 ++++++++++++---
2 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java b/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
index f80597d38e6..20919dc1695 100644
--- a/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
@@ -604,23 +604,20 @@ public class BooleanQuery extends Query implements Iterable<BooleanClause> {
// Important(this can only be processed after nested clauses have been flattened)
{
final Collection<Query> shoulds = clauseSets.get(Occur.SHOULD);
- if (shoulds.size() > 0) {
- if (shoulds.size() < minimumNumberShouldMatch) {
- return new MatchNoDocsQuery("SHOULD clause count less than minimumNumberShouldMatch");
- }
-
- if (shoulds.size() == minimumNumberShouldMatch) {
- BooleanQuery.Builder builder = new BooleanQuery.Builder();
- for (BooleanClause clause : clauses) {
- if (clause.occur() == Occur.SHOULD) {
- builder.add(clause.query(), Occur.MUST);
- } else {
- builder.add(clause);
- }
+ if (shoulds.size() < minimumNumberShouldMatch) {
+ return new MatchNoDocsQuery("SHOULD clause count less than minimumNumberShouldMatch");
+ }
+ if (shoulds.size() > 0 && shoulds.size() == minimumNumberShouldMatch) {
+ BooleanQuery.Builder builder = new BooleanQuery.Builder();
+ for (BooleanClause clause : clauses) {
+ if (clause.occur() == Occur.SHOULD) {
+ builder.add(clause.query(), Occur.MUST);
+ } else {
+ builder.add(clause);
}
-
- return builder.build();
}
+
+ return builder.build();
}
}
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestBooleanRewrites.java b/lucene/core/src/test/org/apache/lucene/search/TestBooleanRewrites.java
index b876fb48963..89d07f66720 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestBooleanRewrites.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestBooleanRewrites.java
@@ -401,14 +401,12 @@ public class TestBooleanRewrites extends LuceneTestCase {
bq =
new BooleanQuery.Builder()
- .setMinimumNumberShouldMatch(random().nextInt(5))
.add(new TermQuery(new Term("foo", "bar")), Occur.MUST)
.add(new TermQuery(new Term("foo", "baz")), Occur.MUST)
.add(new MatchAllDocsQuery(), Occur.FILTER)
.build();
Query expected =
new BooleanQuery.Builder()
- .setMinimumNumberShouldMatch(bq.getMinimumNumberShouldMatch())
.add(new TermQuery(new Term("foo", "bar")), Occur.MUST)
.add(new TermQuery(new Term("foo", "baz")), Occur.MUST)
.build();
@@ -476,7 +474,22 @@ public class TestBooleanRewrites extends LuceneTestCase {
Query query = randomBooleanQuery(random());
final TopDocs td1 = searcher1.search(query, 100);
final TopDocs td2 = searcher2.search(query, 100);
- assertEquals(td1, td2);
+ try {
+ assertEquals(td1, td2);
+ } catch (AssertionError e) {
+ System.out.println(query);
+ Query rewritten = query;
+ do {
+ query = rewritten;
+ rewritten = query.rewrite(searcher1);
+ System.out.println(rewritten);
+ TopDocs tdx = searcher2.search(rewritten, 100);
+ if (td2.totalHits.value() != tdx.totalHits.value()) {
+ System.out.println("Bad");
+ }
+ } while (query != rewritten);
+ throw e;
+ }
}
searcher1.getIndexReader().close();