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;
}
}