Skip to content

Commit a718197

Browse files
committed
added exploration for a percentage of parents
1 parent 839f0e9 commit a718197

File tree

3 files changed

+29
-24
lines changed

3 files changed

+29
-24
lines changed

server/src/main/java/org/elasticsearch/index/codec/vectors/DefaultIVFVectorsWriter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ CentroidAssignments calculateAndWriteCentroids(
310310
i++;
311311
} else {
312312
int label = kMeansResult.parentLayer()[i];
313-
int totalCentroids = 0;
313+
int centroidCount = 0;
314314
float[] parentPartitionCentroid = new float[fieldInfo.getVectorDimension()];
315315
int j = i;
316316
for (; j < kMeansResult.parentLayer().length; j++) {
@@ -320,14 +320,14 @@ CentroidAssignments calculateAndWriteCentroids(
320320
for (int k = 0; k < parentPartitionCentroid.length; k++) {
321321
parentPartitionCentroid[k] += centroids[i][k];
322322
}
323-
totalCentroids++;
323+
centroidCount++;
324324
}
325325
int childOrdinal = i;
326326
i = j;
327327
for (int d = 0; d < parentPartitionCentroid.length; d++) {
328-
parentPartitionCentroid[d] /= totalCentroids;
328+
parentPartitionCentroid[d] /= centroidCount;
329329
}
330-
centroidPartitions.add(new CentroidPartition(parentPartitionCentroid, childOrdinal, totalCentroids));
330+
centroidPartitions.add(new CentroidPartition(parentPartitionCentroid, childOrdinal, centroidCount));
331331
}
332332
}
333333
}

server/src/main/java/org/elasticsearch/index/codec/vectors/IVFVectorsReader.java

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -291,27 +291,31 @@ public final void search(String field, float[] target, KnnCollector knnCollector
291291
}
292292

293293
while (parentCentroidQueue.size() > 0 && (centroidsVisited < nProbe || knnCollectorImpl.numCollected() < knnCollector.k())) {
294-
int parentCentroidOrdinal = parentCentroidQueue.pop();
295-
296-
int childCentroidOrdinal;
297-
int childCentroidCount;
298-
if (parentCentroidOrdinal == -1) {
299-
// score all centroids
300-
childCentroidOrdinal = 0;
301-
childCentroidCount = centroidQueryScorer.size();
302-
} else {
303-
childCentroidOrdinal = parentCentroidQueryScorer.getChildCentroidStart(parentCentroidOrdinal);
304-
childCentroidCount = parentCentroidQueryScorer.getChildCount(parentCentroidOrdinal);
305-
}
306294

307-
NeighborQueue centroidQueue = scorePostingLists(
308-
fieldInfo,
309-
knnCollector,
310-
centroidQueryScorer,
311-
nProbe,
312-
childCentroidOrdinal,
313-
childCentroidCount
314-
);
295+
NeighborQueue centroidQueue = new NeighborQueue(centroidQueryScorer.size(), true);;
296+
int parentsToExplore = 0;
297+
while(parentCentroidQueue.size() > 0 && parentsToExplore < parentCentroidQueryScorer.size() * 0.5) {
298+
int parentCentroidOrdinal = parentCentroidQueue.pop();
299+
300+
int childCentroidOrdinal;
301+
int childCentroidCount;
302+
if (parentCentroidOrdinal == -1) {
303+
// score all centroids
304+
childCentroidOrdinal = 0;
305+
childCentroidCount = centroidQueryScorer.size();
306+
} else {
307+
childCentroidOrdinal = parentCentroidQueryScorer.getChildCentroidStart(parentCentroidOrdinal);
308+
childCentroidCount = parentCentroidQueryScorer.getChildCount(parentCentroidOrdinal);
309+
}
310+
// FIXME: modify scorePostingLists to take a queue instead of creating one
311+
centroidQueryScorer.bulkScore(centroidQueue, childCentroidOrdinal, childCentroidOrdinal + childCentroidCount);
312+
313+
if(parentCentroidOrdinal == -1) {
314+
break;
315+
}
316+
317+
parentsToExplore++;
318+
}
315319

316320
PostingVisitor scorer = getPostingVisitor(fieldInfo, ivfClusters, target, needsScoring);
317321
// initially we visit only the "centroids to search"

server/src/main/java/org/elasticsearch/index/codec/vectors/cluster/KMeansLocal.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ int getBestCentroidOffset(float[][] centroids, float[] vector, int centroidIdx,
135135
}
136136
}
137137
}
138+
138139
return bestCentroidOffset;
139140
}
140141

0 commit comments

Comments
 (0)