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/03/06 17:09:59 UTC

[lucene] branch main updated: Better PostingsEnum reuse in MultiTermQueryConstantScoreBlendedWrapper (#12179)

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

gsmiller 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 b4f969c197c Better PostingsEnum reuse in MultiTermQueryConstantScoreBlendedWrapper (#12179)
b4f969c197c is described below

commit b4f969c197c0d0b582ca88fbe36e00b8e0d7d1f6
Author: Greg Miller <gs...@gmail.com>
AuthorDate: Mon Mar 6 09:09:52 2023 -0800

    Better PostingsEnum reuse in MultiTermQueryConstantScoreBlendedWrapper (#12179)
---
 lucene/CHANGES.txt                                               | 2 ++
 .../lucene/search/MultiTermQueryConstantScoreBlendedWrapper.java | 9 +++++----
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 4e86d5aeff7..9ffa5010899 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -153,6 +153,8 @@ Optimizations
 
 * GITHUB#12139: Faster indexing of string fields. (Adrien Grand)
 
+* GITHUB#12179: Better PostingsEnum reuse in MultiTermQueryConstantScoreBlendedWrapper. (Greg Miller)
+
 Bug Fixes
 ---------------------
 
diff --git a/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreBlendedWrapper.java b/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreBlendedWrapper.java
index 0247a34d25a..a598f644d0c 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreBlendedWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreBlendedWrapper.java
@@ -64,21 +64,22 @@ final class MultiTermQueryConstantScoreBlendedWrapper<Q extends MultiTermQuery>
             };
 
         // Handle the already-collected terms:
+        PostingsEnum reuse = null;
         if (collectedTerms.isEmpty() == false) {
           TermsEnum termsEnum2 = terms.iterator();
           for (TermAndState t : collectedTerms) {
             termsEnum2.seekExact(t.term, t.state);
-            PostingsEnum postings = termsEnum2.postings(null, PostingsEnum.NONE);
+            reuse = termsEnum2.postings(reuse, PostingsEnum.NONE);
             if (t.docFreq <= POSTINGS_PRE_PROCESS_THRESHOLD) {
-              otherTerms.add(postings);
+              otherTerms.add(reuse);
             } else {
-              highFrequencyTerms.add(postings);
+              highFrequencyTerms.add(reuse);
+              reuse = null; // can't reuse since we haven't processed the postings
             }
           }
         }
 
         // Then collect remaining terms:
-        PostingsEnum reuse = null;
         do {
           reuse = termsEnum.postings(reuse, PostingsEnum.NONE);
           // If a term contains all docs with a value for the specified field, we can discard the