Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/changelog/153423.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
area: Vector Search
issues: []
pr: 153423
summary: Apply sequential read advice during merge for `bbq_disk` vectors
type: enhancement
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,15 @@ public class ES920DiskBBQVectorsReader extends IVFVectorsReader<IVFVectorsReader
);
}

private ES920DiskBBQVectorsReader(ES920DiskBBQVectorsReader other, GenericFlatVectorReaders genericReaders) {
super(other, genericReaders);
}

@Override
protected ES920DiskBBQVectorsReader mergeInstance(GenericFlatVectorReaders genericReaders) {
return new ES920DiskBBQVectorsReader(this, genericReaders);
}

public CentroidIterator getPostingListPrefetchIterator(CentroidIterator centroidIterator, IndexInput postingListSlice)
throws IOException {
return new PrefetchingCentroidIterator(centroidIterator, postingListSlice);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,24 @@ protected IVFVectorsReader(
}
}

/**
* Copy constructor used to build a merge instance: shares everything with {@code other} but uses
* the provided flat vector readers (their merge instances).
*/
protected IVFVectorsReader(IVFVectorsReader<E> other, GenericFlatVectorReaders genericReaders) {
this.state = other.state;
this.fieldInfos = other.fieldInfos;
this.fields = other.fields;
this.genericReaders = genericReaders;
this.centroidExtension = other.centroidExtension;
this.clusterExtension = other.clusterExtension;
this.versionDirectIo = other.versionDirectIo;
this.dynamicVisitRatio = other.dynamicVisitRatio;
this.versionMeta = other.versionMeta;
this.ivfCentroids = other.ivfCentroids;
this.ivfClusters = other.ivfClusters;
}

public abstract CentroidIterator getCentroidIterator(
FieldInfo fieldInfo,
int numCentroids,
Expand Down Expand Up @@ -317,6 +335,24 @@ public final void checkIntegrity() throws IOException {
CodecUtil.checksumEntireFile(ivfClusters);
}

@Override
public final KnnVectorsReader getMergeInstance() throws IOException {
// Flat vectors are opened with RANDOM advice for search but read sequentially during a
// merge, so back the merge instance with the flat readers' merge instances (which switch
// their input to SEQUENTIAL). finishMerge() reverts them.
Comment thread
jimczi marked this conversation as resolved.
Outdated
return mergeInstance(genericReaders.getMergeInstance());
}

/** Builds a merge instance of this reader backed by the given flat vector merge readers. */
protected abstract IVFVectorsReader<E> mergeInstance(GenericFlatVectorReaders genericReaders);

@Override
public final void finishMerge() throws IOException {
for (var reader : genericReaders.allReaders()) {
reader.finishMerge();
}
}

protected FlatVectorsReader getReaderForField(String field) {
FieldInfo info = fieldInfos.fieldInfo(field);
if (info == null) throw new IllegalArgumentException("Could not find field [" + field + "]");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,15 @@ public ES940DiskBBQVectorsReader(SegmentReadState state, GenericFlatVectorReader
);
}

private ES940DiskBBQVectorsReader(ES940DiskBBQVectorsReader other, GenericFlatVectorReaders genericReaders) {
super(other, genericReaders);
}

@Override
protected ES940DiskBBQVectorsReader mergeInstance(GenericFlatVectorReaders genericReaders) {
return new ES940DiskBBQVectorsReader(this, genericReaders);
}

CentroidIterator getPostingListPrefetchIterator(CentroidIterator centroidIterator, IndexInput postingListSlice) throws IOException {
// TODO we may want to prefetch more than one postings list, however, we will likely want to place a limit
// so we don't bother prefetching many lists we won't end up scoring
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,15 @@ public ES950DiskBBQVectorsReader(SegmentReadState state, GenericFlatVectorReader
);
}

private ES950DiskBBQVectorsReader(ES950DiskBBQVectorsReader other, GenericFlatVectorReaders genericReaders) {
super(other, genericReaders);
}

@Override
protected ES950DiskBBQVectorsReader mergeInstance(GenericFlatVectorReaders genericReaders) {
return new ES950DiskBBQVectorsReader(this, genericReaders);
}

CentroidIterator getPostingListPrefetchIterator(CentroidIterator centroidIterator, IndexInput postingListSlice) throws IOException {
// TODO we may want to prefetch more than one postings list, however, we will likely want to place a limit
// so we don't bother prefetching many lists we won't end up scoring
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,15 @@ public ESNextDiskBBQVectorsReader(SegmentReadState state, GenericFlatVectorReade
);
}

private ESNextDiskBBQVectorsReader(ESNextDiskBBQVectorsReader other, GenericFlatVectorReaders genericReaders) {
super(other, genericReaders);
}

@Override
protected ESNextDiskBBQVectorsReader mergeInstance(GenericFlatVectorReaders genericReaders) {
return new ESNextDiskBBQVectorsReader(this, genericReaders);
}

CentroidIterator getPostingListPrefetchIterator(CentroidIterator centroidIterator, IndexInput postingListSlice) throws IOException {
// TODO we may want to prefetch more than one postings list, however, we will likely want to place a limit
// so we don't bother prefetching many lists we won't end up scoring
Expand Down
Loading