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 2025/06/03 05:06:26 UTC

(lucene) branch main updated: Merge DocAndFreqBuffer and DocAndScoreBuffer. (#14748)

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

jpountz 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 3b6408ac60b Merge DocAndFreqBuffer and DocAndScoreBuffer. (#14748)
3b6408ac60b is described below

commit 3b6408ac60ba98e5df5e2344a6ffd7815be37f52
Author: Adrien Grand <jp...@gmail.com>
AuthorDate: Tue Jun 3 07:06:21 2025 +0200

    Merge DocAndFreqBuffer and DocAndScoreBuffer. (#14748)
    
    I initially kept those separated but I'm now coming to the conclusion that they
    should be merged:
     - While frequencies are ints today, some queries produce float frequencies
       (`SloppyPhraseQuery`, `CombinedFieldQuery`).
     - `TermScorer` no longer needs to keep track of a separate buffer for
       frequencies.
    
    Co-authored-by: Alan Woodward <ro...@gmail.com>
---
 .../codecs/lucene103/Lucene103PostingsReader.java  |  8 ++--
 .../java/org/apache/lucene/index/CheckIndex.java   |  8 ++--
 .../java/org/apache/lucene/index/PostingsEnum.java | 10 ++---
 .../apache/lucene/search/BatchScoreBulkScorer.java |  4 +-
 .../search/BlockMaxConjunctionBulkScorer.java      |  2 +-
 .../org/apache/lucene/search/BooleanScorer.java    |  4 +-
 ...eqBuffer.java => DocAndFloatFeatureBuffer.java} | 19 ++++----
 .../apache/lucene/search/DocAndScoreAccBuffer.java |  9 ++--
 .../apache/lucene/search/DocAndScoreBuffer.java    | 50 ----------------------
 .../apache/lucene/search/MaxScoreBulkScorer.java   |  4 +-
 .../src/java/org/apache/lucene/search/Scorer.java  |  8 ++--
 .../java/org/apache/lucene/search/TermScorer.java  | 24 ++++-------
 .../org/apache/lucene/search/TestTermScorer.java   |  4 +-
 .../lucene/tests/index/AssertingLeafReader.java    |  4 +-
 .../lucene/tests/index/RandomPostingsTester.java   |  6 +--
 .../lucene/tests/search/AssertingScorer.java       |  4 +-
 16 files changed, 59 insertions(+), 109 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene103/Lucene103PostingsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene103/Lucene103PostingsReader.java
index f4d64318f32..6bfa3c3b669 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene103/Lucene103PostingsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene103/Lucene103PostingsReader.java
@@ -46,7 +46,7 @@ import org.apache.lucene.index.PostingsEnum;
 import org.apache.lucene.index.SegmentReadState;
 import org.apache.lucene.internal.vectorization.PostingDecodingUtil;
 import org.apache.lucene.internal.vectorization.VectorizationProvider;
-import org.apache.lucene.search.DocAndFreqBuffer;
+import org.apache.lucene.search.DocAndFloatFeatureBuffer;
 import org.apache.lucene.store.ByteArrayDataInput;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.DataInput;
@@ -1036,7 +1036,7 @@ public final class Lucene103PostingsReader extends PostingsReaderBase {
     }
 
     @Override
-    public void nextPostings(int upTo, DocAndFreqBuffer buffer) throws IOException {
+    public void nextPostings(int upTo, DocAndFloatFeatureBuffer buffer) throws IOException {
       assert needsRefilling == false;
 
       if (needsFreq == false) {
@@ -1073,7 +1073,9 @@ public final class Lucene103PostingsReader extends PostingsReaderBase {
       }
 
       assert buffer.size > 0;
-      System.arraycopy(freqBuffer, start, buffer.freqs, 0, buffer.size);
+      for (int i = 0; i < buffer.size; ++i) {
+        buffer.features[i] = freqBuffer[start + i];
+      }
 
       advance(upTo);
     }
diff --git a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
index e2d97b1355f..49c6ef2f137 100644
--- a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
+++ b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
@@ -63,7 +63,7 @@ import org.apache.lucene.index.CheckIndex.Status.DocValuesStatus;
 import org.apache.lucene.index.PointValues.IntersectVisitor;
 import org.apache.lucene.index.PointValues.Relation;
 import org.apache.lucene.internal.hppc.IntIntHashMap;
-import org.apache.lucene.search.DocAndFreqBuffer;
+import org.apache.lucene.search.DocAndFloatFeatureBuffer;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.FieldExistsQuery;
 import org.apache.lucene.search.KnnCollector;
@@ -1653,7 +1653,7 @@ public final class CheckIndex implements Closeable {
         postings = termsEnum.postings(postings, PostingsEnum.ALL);
         bulkPostings = termsEnum.postings(bulkPostings, PostingsEnum.ALL);
         bulkPostings.nextDoc();
-        DocAndFreqBuffer buffer = new DocAndFreqBuffer();
+        DocAndFloatFeatureBuffer buffer = new DocAndFloatFeatureBuffer();
         int bufferIndex = 0;
 
         if (hasFreqs == false) {
@@ -1719,10 +1719,10 @@ public final class CheckIndex implements Closeable {
                     + " as next doc while PostingsEnum#nextDoc returns "
                     + doc);
           }
-          if (freq != buffer.freqs[bufferIndex]) {
+          if (freq != buffer.features[bufferIndex]) {
             throw new CheckIndexException(
                 "PostingsEnum#nextPostings returns "
-                    + buffer.freqs[bufferIndex]
+                    + buffer.features[bufferIndex]
                     + " as term freq while PostingsEnum#freq returns "
                     + freq);
           }
diff --git a/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java b/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java
index 8e82e0a6d69..8fd9d8c9a37 100644
--- a/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java
+++ b/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java
@@ -17,7 +17,7 @@
 package org.apache.lucene.index;
 
 import java.io.IOException;
-import org.apache.lucene.search.DocAndFreqBuffer;
+import org.apache.lucene.search.DocAndFloatFeatureBuffer;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.util.BytesRef;
 
@@ -126,18 +126,18 @@ public abstract class PostingsEnum extends DocIdSetIterator {
    * buffer.size = size;
    * </pre>
    *
-   * <p><b>NOTE</b>: The provided {@link DocAndFreqBuffer} should not hold references to internal
-   * data structures.
+   * <p><b>NOTE</b>: The provided {@link DocAndFloatFeatureBuffer} should not hold references to
+   * internal data structures.
    *
    * @lucene.internal
    */
-  public void nextPostings(int upTo, DocAndFreqBuffer buffer) throws IOException {
+  public void nextPostings(int upTo, DocAndFloatFeatureBuffer buffer) throws IOException {
     int batchSize = 16; // arbitrary
     buffer.growNoCopy(batchSize);
     int size = 0;
     for (int doc = docID(); doc < upTo && size < batchSize; doc = nextDoc()) {
       buffer.docs[size] = doc;
-      buffer.freqs[size] = freq();
+      buffer.features[size] = freq();
       ++size;
     }
     buffer.size = size;
diff --git a/lucene/core/src/java/org/apache/lucene/search/BatchScoreBulkScorer.java b/lucene/core/src/java/org/apache/lucene/search/BatchScoreBulkScorer.java
index c000209d2fc..d1412fb5e45 100644
--- a/lucene/core/src/java/org/apache/lucene/search/BatchScoreBulkScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/BatchScoreBulkScorer.java
@@ -26,7 +26,7 @@ import org.apache.lucene.util.Bits;
 class BatchScoreBulkScorer extends BulkScorer {
 
   private final SimpleScorable scorable = new SimpleScorable();
-  private final DocAndScoreBuffer buffer = new DocAndScoreBuffer();
+  private final DocAndFloatFeatureBuffer buffer = new DocAndFloatFeatureBuffer();
   private final Scorer scorer;
 
   BatchScoreBulkScorer(Scorer scorer) {
@@ -50,7 +50,7 @@ class BatchScoreBulkScorer extends BulkScorer {
         buffer.size > 0;
         scorer.nextDocsAndScores(max, acceptDocs, buffer)) {
       for (int i = 0, size = buffer.size; i < size; i++) {
-        float score = scorable.score = buffer.scores[i];
+        float score = scorable.score = buffer.features[i];
         if (score >= scorable.minCompetitiveScore) {
           collector.collect(buffer.docs[i]);
         }
diff --git a/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionBulkScorer.java b/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionBulkScorer.java
index e2e063feb5e..31904eeff7e 100644
--- a/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionBulkScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionBulkScorer.java
@@ -41,7 +41,7 @@ final class BlockMaxConjunctionBulkScorer extends BulkScorer {
   private final DocAndScore scorable = new DocAndScore();
   private final double[] sumOfOtherClauses;
   private final int maxDoc;
-  private final DocAndScoreBuffer docAndScoreBuffer = new DocAndScoreBuffer();
+  private final DocAndFloatFeatureBuffer docAndScoreBuffer = new DocAndFloatFeatureBuffer();
   private final DocAndScoreAccBuffer docAndScoreAccBuffer = new DocAndScoreAccBuffer();
 
   BlockMaxConjunctionBulkScorer(int maxDoc, List<Scorer> scorers) throws IOException {
diff --git a/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java b/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
index 1f4dd4f80ce..9bb2ec7882a 100644
--- a/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
@@ -81,7 +81,7 @@ final class BooleanScorer extends BulkScorer {
   final int minShouldMatch;
   final long cost;
   final boolean needsScores;
-  private final DocAndScoreBuffer docAndScoreBuffer = new DocAndScoreBuffer();
+  private final DocAndFloatFeatureBuffer docAndScoreBuffer = new DocAndFloatFeatureBuffer();
 
   BooleanScorer(Collection<Scorer> scorers, int minShouldMatch, boolean needsScores) {
     if (minShouldMatch < 1 || minShouldMatch > scorers.size()) {
@@ -148,7 +148,7 @@ final class BooleanScorer extends BulkScorer {
             w.scorer.nextDocsAndScores(max, acceptDocs, docAndScoreBuffer)) {
           for (int index = 0; index < docAndScoreBuffer.size; ++index) {
             final int doc = docAndScoreBuffer.docs[index];
-            final float score = docAndScoreBuffer.scores[index];
+            final float score = docAndScoreBuffer.features[index];
             final int d = doc & MASK;
             matching.set(d);
             final Bucket bucket = buckets[d];
diff --git a/lucene/core/src/java/org/apache/lucene/search/DocAndFreqBuffer.java b/lucene/core/src/java/org/apache/lucene/search/DocAndFloatFeatureBuffer.java
similarity index 77%
rename from lucene/core/src/java/org/apache/lucene/search/DocAndFreqBuffer.java
rename to lucene/core/src/java/org/apache/lucene/search/DocAndFloatFeatureBuffer.java
index 3e45d3cf429..78fd7dd1055 100644
--- a/lucene/core/src/java/org/apache/lucene/search/DocAndFreqBuffer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/DocAndFloatFeatureBuffer.java
@@ -21,29 +21,32 @@ import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.IntsRef;
 
 /**
- * Wrapper around parallel arrays storing doc IDs and their corresponding frequencies.
+ * Wrapper around parallel arrays storing doc IDs and their corresponding features, stored as Java
+ * floats. These features may be anything, but are typically a term frequency or a score.
  *
  * @lucene.internal
  */
-public final class DocAndFreqBuffer {
+public final class DocAndFloatFeatureBuffer {
+
+  private static final float[] EMPTY_FLOATS = new float[0];
 
   /** Doc IDs */
   public int[] docs = IntsRef.EMPTY_INTS;
 
-  /** Frequencies */
-  public int[] freqs = IntsRef.EMPTY_INTS;
+  /** Float-valued features */
+  public float[] features = EMPTY_FLOATS;
 
-  /** Number of valid entries in the doc ID and frequency arrays. */
+  /** Number of valid entries in the doc ID and float-valued feature arrays. */
   public int size;
 
   /** Sole constructor. */
-  public DocAndFreqBuffer() {}
+  public DocAndFloatFeatureBuffer() {}
 
   /** Grow both arrays to ensure that they can store at least the given number of entries. */
   public void growNoCopy(int minSize) {
     if (docs.length < minSize) {
       docs = ArrayUtil.growNoCopy(docs, minSize);
-      freqs = new int[docs.length];
+      features = new float[docs.length];
     }
   }
 
@@ -53,7 +56,7 @@ public final class DocAndFreqBuffer {
     for (int i = 0; i < size; ++i) {
       if (liveDocs.get(docs[i])) {
         docs[newSize] = docs[i];
-        freqs[newSize] = freqs[i];
+        features[newSize] = features[i];
         newSize++;
       }
     }
diff --git a/lucene/core/src/java/org/apache/lucene/search/DocAndScoreAccBuffer.java b/lucene/core/src/java/org/apache/lucene/search/DocAndScoreAccBuffer.java
index dd05e53aac2..ed5ffbc3f9a 100644
--- a/lucene/core/src/java/org/apache/lucene/search/DocAndScoreAccBuffer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/DocAndScoreAccBuffer.java
@@ -62,12 +62,15 @@ public final class DocAndScoreAccBuffer {
     }
   }
 
-  /** Copy content from the given {@link DocAndScoreBuffer}, expanding float scores to doubles. */
-  public void copyFrom(DocAndScoreBuffer buffer) {
+  /**
+   * Copy content from the given {@link DocAndFloatFeatureBuffer}, expanding float scores to
+   * doubles.
+   */
+  public void copyFrom(DocAndFloatFeatureBuffer buffer) {
     growNoCopy(buffer.size);
     System.arraycopy(buffer.docs, 0, docs, 0, buffer.size);
     for (int i = 0; i < buffer.size; ++i) {
-      scores[i] = buffer.scores[i];
+      scores[i] = buffer.features[i];
     }
     this.size = buffer.size;
   }
diff --git a/lucene/core/src/java/org/apache/lucene/search/DocAndScoreBuffer.java b/lucene/core/src/java/org/apache/lucene/search/DocAndScoreBuffer.java
deleted file mode 100644
index 5daef38c0ff..00000000000
--- a/lucene/core/src/java/org/apache/lucene/search/DocAndScoreBuffer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.lucene.search;
-
-import org.apache.lucene.util.ArrayUtil;
-import org.apache.lucene.util.IntsRef;
-
-/**
- * Wrapper around parallel arrays storing doc IDs and their corresponding scores.
- *
- * @lucene.internal
- */
-public final class DocAndScoreBuffer {
-
-  private static final float[] EMPTY_FLOATS = new float[0];
-
-  /** Doc IDs */
-  public int[] docs = IntsRef.EMPTY_INTS;
-
-  /** Scores */
-  public float[] scores = EMPTY_FLOATS;
-
-  /** Number of valid entries in the doc ID and score arrays. */
-  public int size;
-
-  /** Sole constructor. */
-  public DocAndScoreBuffer() {}
-
-  /** Grow both arrays to ensure that they can store at least the given number of entries. */
-  public void growNoCopy(int minSize) {
-    if (docs.length < minSize) {
-      docs = ArrayUtil.growNoCopy(docs, minSize);
-      scores = new float[docs.length];
-    }
-  }
-}
diff --git a/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java b/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java
index f6e83c7af52..87135f91147 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MaxScoreBulkScorer.java
@@ -51,7 +51,7 @@ final class MaxScoreBulkScorer extends BulkScorer {
   private final FixedBitSet windowMatches = new FixedBitSet(INNER_WINDOW_SIZE);
   private final double[] windowScores = new double[INNER_WINDOW_SIZE];
 
-  private final DocAndScoreBuffer docAndScoreBuffer = new DocAndScoreBuffer();
+  private final DocAndFloatFeatureBuffer docAndScoreBuffer = new DocAndFloatFeatureBuffer();
   private final DocAndScoreAccBuffer docAndScoreAccBuffer = new DocAndScoreAccBuffer();
 
   MaxScoreBulkScorer(int maxDoc, List<Scorer> scorers, Scorer filter) throws IOException {
@@ -287,7 +287,7 @@ final class MaxScoreBulkScorer extends BulkScorer {
           top.scorer.nextDocsAndScores(innerWindowMax, acceptDocs, docAndScoreBuffer)) {
         for (int index = 0; index < docAndScoreBuffer.size; ++index) {
           final int doc = docAndScoreBuffer.docs[index];
-          final float score = docAndScoreBuffer.scores[index];
+          final float score = docAndScoreBuffer.features[index];
           final int i = doc - innerWindowMin;
           windowMatches.set(i);
           windowScores[i] += score;
diff --git a/lucene/core/src/java/org/apache/lucene/search/Scorer.java b/lucene/core/src/java/org/apache/lucene/search/Scorer.java
index 64db31ba9fd..86207f5c18c 100644
--- a/lucene/core/src/java/org/apache/lucene/search/Scorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/Scorer.java
@@ -107,15 +107,15 @@ public abstract class Scorer extends Scorable {
    * buffer.size = size;
    * </pre>
    *
-   * <p><b>NOTE</b>: The provided {@link DocAndScoreBuffer} should not hold references to internal
-   * data structures.
+   * <p><b>NOTE</b>: The provided {@link DocAndFloatFeatureBuffer} should not hold references to
+   * internal data structures.
    *
    * <p><b>NOTE</b>: In case this {@link Scorer} exposes a {@link #twoPhaseIterator()
    * TwoPhaseIterator}, it should be positioned on a matching document before this method is called.
    *
    * @lucene.internal
    */
-  public void nextDocsAndScores(int upTo, Bits liveDocs, DocAndScoreBuffer buffer)
+  public void nextDocsAndScores(int upTo, Bits liveDocs, DocAndFloatFeatureBuffer buffer)
       throws IOException {
     int batchSize = 16; // arbitrary
     buffer.growNoCopy(batchSize);
@@ -124,7 +124,7 @@ public abstract class Scorer extends Scorable {
     for (int doc = docID(); doc < upTo && size < batchSize; doc = iterator.nextDoc()) {
       if (liveDocs == null || liveDocs.get(doc)) {
         buffer.docs[size] = doc;
-        buffer.scores[size] = score();
+        buffer.features[size] = score();
         ++size;
       }
     }
diff --git a/lucene/core/src/java/org/apache/lucene/search/TermScorer.java b/lucene/core/src/java/org/apache/lucene/search/TermScorer.java
index db782692f45..278f735838e 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TermScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TermScorer.java
@@ -39,7 +39,6 @@ public final class TermScorer extends Scorer {
   private final NumericDocValues norms;
   private final ImpactsDISI impactsDisi;
   private final MaxScoreCache maxScoreCache;
-  private DocAndFreqBuffer docAndFreqBuffer;
   private long[] normValues = LongsRef.EMPTY_LONGS;
 
   /** Construct a {@link TermScorer} that will iterate all documents. */
@@ -128,32 +127,28 @@ public final class TermScorer extends Scorer {
   }
 
   @Override
-  public void nextDocsAndScores(int upTo, Bits liveDocs, DocAndScoreBuffer buffer)
+  public void nextDocsAndScores(int upTo, Bits liveDocs, DocAndFloatFeatureBuffer buffer)
       throws IOException {
-    if (docAndFreqBuffer == null) {
-      docAndFreqBuffer = new DocAndFreqBuffer();
-    }
-
     for (; ; ) {
       if (impactsDisi != null) {
         impactsDisi.ensureCompetitive();
       }
 
-      postingsEnum.nextPostings(upTo, docAndFreqBuffer);
-      if (liveDocs != null && docAndFreqBuffer.size != 0) {
+      postingsEnum.nextPostings(upTo, buffer);
+      if (liveDocs != null && buffer.size != 0) {
         // An empty return value indicates that there are no more docs before upTo. We may be
         // unlucky, and there are docs left, but all docs from the current batch happen to be marked
         // as deleted. So we need to iterate until we find a batch that has at least one non-deleted
         // doc.
-        docAndFreqBuffer.apply(liveDocs);
-        if (docAndFreqBuffer.size == 0) {
+        buffer.apply(liveDocs);
+        if (buffer.size == 0) {
           continue;
         }
       }
       break;
     }
 
-    int size = docAndFreqBuffer.size;
+    int size = buffer.size;
     if (normValues.length < size) {
       normValues = new long[ArrayUtil.oversize(size, Long.BYTES)];
       if (norms == null) {
@@ -162,7 +157,7 @@ public final class TermScorer extends Scorer {
     }
     if (norms != null) {
       for (int i = 0; i < size; ++i) {
-        if (norms.advanceExact(docAndFreqBuffer.docs[i])) {
+        if (norms.advanceExact(buffer.docs[i])) {
           normValues[i] = norms.longValue();
         } else {
           normValues[i] = 1L;
@@ -170,13 +165,10 @@ public final class TermScorer extends Scorer {
       }
     }
 
-    buffer.growNoCopy(size);
-    buffer.size = size;
-    System.arraycopy(docAndFreqBuffer.docs, 0, buffer.docs, 0, size);
     for (int i = 0; i < size; ++i) {
       // Unless SimScorer#score is megamorphic, SimScorer#score should inline and (part of) score
       // computations should auto-vectorize.
-      buffer.scores[i] = scorer.score(docAndFreqBuffer.freqs[i], normValues[i]);
+      buffer.features[i] = scorer.score(buffer.features[i], normValues[i]);
     }
   }
 }
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java b/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
index 3264af9dc8b..c2dfa2e6e6a 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
@@ -281,7 +281,7 @@ public class TestTermScorer extends LuceneTestCase {
     Scorer scorer2 = weight.scorer(context);
     scorer1.iterator().nextDoc();
     scorer2.iterator().nextDoc();
-    DocAndScoreBuffer buffer = new DocAndScoreBuffer();
+    DocAndFloatFeatureBuffer buffer = new DocAndFloatFeatureBuffer();
     while (true) {
       int curDoc = scorer2.iterator().docID();
       int upTo =
@@ -294,7 +294,7 @@ public class TestTermScorer extends LuceneTestCase {
           scorer2.iterator().nextDoc();
         }
         assertEquals(scorer2.iterator().docID(), buffer.docs[i]);
-        assertEquals(scorer2.score(), buffer.scores[i], 0f);
+        assertEquals(scorer2.score(), buffer.features[i], 0f);
         scorer2.iterator().nextDoc();
       }
 
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java b/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java
index 898d93fdc0f..256e13c514e 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java
@@ -50,7 +50,7 @@ import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
 import org.apache.lucene.internal.tests.IndexPackageAccess;
 import org.apache.lucene.internal.tests.TestSecrets;
-import org.apache.lucene.search.DocAndFreqBuffer;
+import org.apache.lucene.search.DocAndFloatFeatureBuffer;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
@@ -598,7 +598,7 @@ public class AssertingLeafReader extends FilterLeafReader {
     }
 
     @Override
-    public void nextPostings(int upTo, DocAndFreqBuffer buffer) throws IOException {
+    public void nextPostings(int upTo, DocAndFloatFeatureBuffer buffer) throws IOException {
       assert state != DocsEnumState.START : "nextPostings() called before nextDoc()/advance()";
       in.nextPostings(upTo, buffer);
       doc = in.docID();
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/index/RandomPostingsTester.java b/lucene/test-framework/src/java/org/apache/lucene/tests/index/RandomPostingsTester.java
index d66d1667626..f8c6f93702d 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/index/RandomPostingsTester.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/index/RandomPostingsTester.java
@@ -66,7 +66,7 @@ import org.apache.lucene.index.VectorEncoding;
 import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.internal.tests.IndexPackageAccess;
 import org.apache.lucene.internal.tests.TestSecrets;
-import org.apache.lucene.search.DocAndFreqBuffer;
+import org.apache.lucene.search.DocAndFloatFeatureBuffer;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FlushInfo;
@@ -1443,7 +1443,7 @@ public class RandomPostingsTester {
 
         pe1.nextDoc();
         pe2.nextDoc();
-        DocAndFreqBuffer buffer = new DocAndFreqBuffer();
+        DocAndFloatFeatureBuffer buffer = new DocAndFloatFeatureBuffer();
         while (true) {
           int curDoc = pe1.docID();
           int upTo =
@@ -1454,7 +1454,7 @@ public class RandomPostingsTester {
           for (int i = 0; i < buffer.size; ++i) {
             assertTrue(buffer.docs[i] < upTo);
             assertEquals(pe2.docID(), buffer.docs[i]);
-            assertEquals(pe2.freq(), buffer.freqs[i]);
+            assertEquals(0f, pe2.freq(), buffer.features[i]);
             pe2.nextDoc();
           }
 
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/search/AssertingScorer.java b/lucene/test-framework/src/java/org/apache/lucene/tests/search/AssertingScorer.java
index 1910a48d074..f0ef919761c 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/search/AssertingScorer.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/search/AssertingScorer.java
@@ -19,7 +19,7 @@ package org.apache.lucene.tests.search;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
-import org.apache.lucene.search.DocAndScoreBuffer;
+import org.apache.lucene.search.DocAndFloatFeatureBuffer;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.FilterDocIdSetIterator;
 import org.apache.lucene.search.Scorer;
@@ -286,7 +286,7 @@ public class AssertingScorer extends Scorer {
   }
 
   @Override
-  public void nextDocsAndScores(int upTo, Bits liveDocs, DocAndScoreBuffer buffer)
+  public void nextDocsAndScores(int upTo, Bits liveDocs, DocAndFloatFeatureBuffer buffer)
       throws IOException {
     assert doc != -1;
     in.nextDocsAndScores(upTo, liveDocs, buffer);