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 2023/07/24 14:43:20 UTC

[lucene] branch branch_9x updated: Assert IdxOrDvQuery subqueries and document useful fields (#12442)

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

jpountz 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 47cbf50d1c0 Assert IdxOrDvQuery subqueries and document useful fields (#12442)
47cbf50d1c0 is described below

commit 47cbf50d1c0599325b0415a0975fa5cc476bce53
Author: Stefan Vodita <41...@users.noreply.github.com>
AuthorDate: Mon Jul 24 15:36:48 2023 +0100

    Assert IdxOrDvQuery subqueries and document useful fields (#12442)
---
 .../java/org/apache/lucene/search/IndexOrDocValuesQuery.java  |  6 ++++++
 .../org/apache/lucene/search/TestIndexOrDocValuesQuery.java   |  7 +++++++
 .../src/java/org/apache/lucene/tests/search/QueryUtils.java   | 11 ++++++++++-
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java b/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java
index 599608f0d84..9ccc45f5434 100644
--- a/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/IndexOrDocValuesQuery.java
@@ -42,6 +42,12 @@ import org.apache.lucene.index.LeafReaderContext;
  * otherwise, ie. in the case that another part of the query is already leading iteration but we
  * still need the ability to verify that some documents match.
  *
+ * <p>Some field types that work well with {@link IndexOrDocValuesQuery} are {@link
+ * org.apache.lucene.document.IntField}, {@link org.apache.lucene.document.LongField}, {@link
+ * org.apache.lucene.document.FloatField}, {@link org.apache.lucene.document.DoubleField}, and
+ * {@link org.apache.lucene.document.KeywordField}. These fields provide both an indexed structure
+ * and doc values.
+ *
  * <p><b>NOTE</b>This query currently only works well with point range/exact queries and their
  * equivalent doc values queries.
  *
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java
index 19d562db795..e24c0cdb7c8 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestIndexOrDocValuesQuery.java
@@ -31,6 +31,7 @@ import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.tests.search.QueryUtils;
 import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.TestUtil;
 
@@ -76,6 +77,7 @@ public class TestIndexOrDocValuesQuery extends LuceneTestCase {
                     NumericDocValuesField.newSlowRangeQuery("f2", 2L, 2L)),
                 Occur.MUST)
             .build();
+    QueryUtils.check(random(), q1, searcher);
 
     final Weight w1 = searcher.createWeight(searcher.rewrite(q1), ScoreMode.COMPLETE, 1);
     final Scorer s1 = w1.scorer(searcher.getIndexReader().leaves().get(0));
@@ -91,6 +93,7 @@ public class TestIndexOrDocValuesQuery extends LuceneTestCase {
                     NumericDocValuesField.newSlowRangeQuery("f2", 42L, 42L)),
                 Occur.MUST)
             .build();
+    QueryUtils.check(random(), q2, searcher);
 
     final Weight w2 = searcher.createWeight(searcher.rewrite(q2), ScoreMode.COMPLETE, 1);
     final Scorer s2 = w2.scorer(searcher.getIndexReader().leaves().get(0));
@@ -142,6 +145,7 @@ public class TestIndexOrDocValuesQuery extends LuceneTestCase {
                     SortedNumericDocValuesField.newSlowRangeQuery("f2", 2L, 2L)),
                 Occur.MUST)
             .build();
+    QueryUtils.check(random(), q1, searcher);
 
     final Weight w1 = searcher.createWeight(searcher.rewrite(q1), ScoreMode.COMPLETE, 1);
     final Scorer s1 = w1.scorer(searcher.getIndexReader().leaves().get(0));
@@ -157,6 +161,7 @@ public class TestIndexOrDocValuesQuery extends LuceneTestCase {
                     SortedNumericDocValuesField.newSlowRangeQuery("f2", 42, 42L)),
                 Occur.MUST)
             .build();
+    QueryUtils.check(random(), q2, searcher);
 
     final Weight w2 = searcher.createWeight(searcher.rewrite(q2), ScoreMode.COMPLETE, 1);
     final Scorer s2 = w2.scorer(searcher.getIndexReader().leaves().get(0));
@@ -172,6 +177,7 @@ public class TestIndexOrDocValuesQuery extends LuceneTestCase {
                     SortedNumericDocValuesField.newSlowRangeQuery("f2", 42, 42L)),
                 Occur.MUST)
             .build();
+    QueryUtils.check(random(), q3, searcher);
 
     final Weight w3 = searcher.createWeight(searcher.rewrite(q3), ScoreMode.COMPLETE, 1);
     final Scorer s3 = w3.scorer(searcher.getIndexReader().leaves().get(0));
@@ -206,6 +212,7 @@ public class TestIndexOrDocValuesQuery extends LuceneTestCase {
         new IndexOrDocValuesQuery(
             LongPoint.newExactQuery("f2", 42),
             SortedNumericDocValuesField.newSlowRangeQuery("f2", 42, 42L));
+    QueryUtils.check(random(), query, searcher);
 
     final int searchCount = searcher.count(query);
     final Weight weight = searcher.createWeight(query, ScoreMode.COMPLETE, 1);
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java b/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java
index da25bd3acc8..4cf7dcd0a5d 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java
@@ -51,6 +51,7 @@ import org.apache.lucene.search.QueryVisitor;
 import org.apache.lucene.search.Scorable;
 import org.apache.lucene.search.ScoreMode;
 import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.ScorerSupplier;
 import org.apache.lucene.search.SimpleCollector;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.Weight;
@@ -684,7 +685,15 @@ public class QueryUtils {
     query = searcher.rewrite(query);
     Weight weight = searcher.createWeight(query, ScoreMode.COMPLETE, 1);
     for (LeafReaderContext context : searcher.getIndexReader().leaves()) {
-      final Scorer scorer = weight.scorer(context);
+      final Scorer scorer;
+      final ScorerSupplier scorerSupplier = weight.scorerSupplier(context);
+      if (scorerSupplier == null) {
+        scorer = null;
+      } else {
+        // For IndexOrDocValuesQuey, the bulk scorer will use the indexed structure query
+        // and the scorer with a lead cost of 0 will use the doc values query.
+        scorer = scorerSupplier.get(0);
+      }
       final BulkScorer bulkScorer = weight.bulkScorer(context);
       if (scorer == null && bulkScorer == null) {
         continue;