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;