You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by gs...@apache.org on 2023/02/19 17:03:29 UTC

[lucene] branch branch_9x updated: Speed up DocValuesRewriteMethod by making use of sortedness (#12155)

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

gsmiller 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 677be1699f8 Speed up DocValuesRewriteMethod by making use of sortedness (#12155)
677be1699f8 is described below

commit 677be1699f83a65927f23cc6c77a7d456479b97d
Author: Greg Miller <gs...@gmail.com>
AuthorDate: Sun Feb 19 08:33:26 2023 -0800

    Speed up DocValuesRewriteMethod by making use of sortedness (#12155)
---
 lucene/CHANGES.txt                                        |  2 ++
 .../org/apache/lucene/search/DocValuesRewriteMethod.java  | 15 ++++++++++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 8b5026ff691..585715f03e9 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -36,6 +36,8 @@ Optimizations
 
 * GITHUB#12050: Reuse HNSW graph for intialization during merge (Jack Mazanec)
 
+* GITHUB#12155: Speed up DocValuesRewriteMethod by making use of sortedness. (Greg Miller)
+
 Bug Fixes
 ---------------------
 (No changes)
diff --git a/lucene/core/src/java/org/apache/lucene/search/DocValuesRewriteMethod.java b/lucene/core/src/java/org/apache/lucene/search/DocValuesRewriteMethod.java
index e0e9efc7822..f92076d502e 100644
--- a/lucene/core/src/java/org/apache/lucene/search/DocValuesRewriteMethod.java
+++ b/lucene/core/src/java/org/apache/lucene/search/DocValuesRewriteMethod.java
@@ -173,15 +173,25 @@ public final class DocValuesRewriteMethod extends MultiTermQuery.RewriteMethod {
               // query that are actually present in the doc values field). Cannot use FixedBitSet
               // because we require long index (ord):
               final LongBitSet termSet = new LongBitSet(values.getValueCount());
+              long maxOrd = -1;
               do {
                 long ord = termsEnum.ord();
                 if (ord >= 0) {
+                  assert ord > maxOrd;
+                  maxOrd = ord;
                   termSet.set(ord);
                 }
               } while (termsEnum.next() != null);
 
+              // no terms matched in this segment
+              if (maxOrd < 0) {
+                return new ConstantScoreScorer(
+                    weight, score(), scoreMode, DocIdSetIterator.empty());
+              }
+
               final SortedDocValues singleton = DocValues.unwrapSingleton(values);
               final TwoPhaseIterator iterator;
+              final long max = maxOrd;
               if (singleton != null) {
                 iterator =
                     new TwoPhaseIterator(singleton) {
@@ -201,7 +211,10 @@ public final class DocValuesRewriteMethod extends MultiTermQuery.RewriteMethod {
                       @Override
                       public boolean matches() throws IOException {
                         for (int i = 0; i < values.docValueCount(); i++) {
-                          if (termSet.get(values.nextOrd())) {
+                          long value = values.nextOrd();
+                          if (value > max) {
+                            return false; // values are sorted, terminate
+                          } else if (termSet.get(value)) {
                             return true;
                           }
                         }