Skip to content

Commit a073f43

Browse files
committed
Sort in query constructor, use ScoreDoc[] vs building individual arrays on the clients
1 parent 813f001 commit a073f43

File tree

3 files changed

+12
-33
lines changed

3 files changed

+12
-33
lines changed

server/src/main/java/org/elasticsearch/search/vectors/KnnScoreDocQuery.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717
import org.apache.lucene.search.MatchNoDocsQuery;
1818
import org.apache.lucene.search.Query;
1919
import org.apache.lucene.search.QueryVisitor;
20+
import org.apache.lucene.search.ScoreDoc;
2021
import org.apache.lucene.search.ScoreMode;
2122
import org.apache.lucene.search.Scorer;
2223
import org.apache.lucene.search.ScorerSupplier;
2324
import org.apache.lucene.search.Weight;
24-
import org.elasticsearch.core.Assertions;
2525

2626
import java.io.IOException;
2727
import java.util.Arrays;
28+
import java.util.Comparator;
2829
import java.util.Objects;
2930

3031
import static org.apache.lucene.search.DocIdSetIterator.NO_MORE_DOCS;
@@ -51,20 +52,17 @@ public class KnnScoreDocQuery extends Query {
5152
/**
5253
* Creates a query.
5354
*
54-
* @param docs the global doc IDs of documents that match, in ascending order
55-
* @param scores the scores of the matching documents
55+
* @param scoreDocs an array of ScoreDocs to use for the query
5656
* @param reader IndexReader
5757
*/
58-
KnnScoreDocQuery(int[] docs, float[] scores, IndexReader reader) {
59-
if (Assertions.ENABLED) {
60-
assert docs.length == scores.length;
61-
for (int i = 1; i < docs.length; i++) {
62-
assert docs[i - 1] < docs[i] : "doc ids are not in order: " + Arrays.toString(docs);
63-
}
58+
KnnScoreDocQuery(ScoreDoc[] scoreDocs, IndexReader reader) {
59+
Arrays.sort(scoreDocs, Comparator.comparingInt(scoreDoc -> scoreDoc.doc));
60+
this.docs = new int[scoreDocs.length];
61+
this.scores = new float[scoreDocs.length];
62+
for (int i = 0; i < scoreDocs.length; i++) {
63+
docs[i] = scoreDocs[i].doc;
64+
scores[i] = scoreDocs[i].score;
6465
}
65-
66-
this.docs = docs;
67-
this.scores = scores;
6866
this.segmentStarts = findSegmentStarts(reader, docs);
6967
this.contextIdentity = reader.getContext().id();
7068
}

server/src/main/java/org/elasticsearch/search/vectors/KnnScoreDocQueryBuilder.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,7 @@ protected void doXContent(XContentBuilder builder, Params params) throws IOExcep
141141

142142
@Override
143143
protected Query doToQuery(SearchExecutionContext context) throws IOException {
144-
int numDocs = scoreDocs.length;
145-
int[] docs = new int[numDocs];
146-
float[] scores = new float[numDocs];
147-
for (int i = 0; i < numDocs; i++) {
148-
docs[i] = scoreDocs[i].doc;
149-
scores[i] = scoreDocs[i].score;
150-
}
151-
152-
return new KnnScoreDocQuery(docs, scores, context.getIndexReader());
144+
return new KnnScoreDocQuery(scoreDocs, context.getIndexReader());
153145
}
154146

155147
@Override

server/src/main/java/org/elasticsearch/search/vectors/RescoreKnnVectorQuery.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@
1616
import org.apache.lucene.search.IndexSearcher;
1717
import org.apache.lucene.search.Query;
1818
import org.apache.lucene.search.QueryVisitor;
19-
import org.apache.lucene.search.ScoreDoc;
2019
import org.apache.lucene.search.TopDocs;
2120
import org.elasticsearch.index.mapper.vectors.VectorSimilarityFloatValueSource;
2221
import org.elasticsearch.search.profile.query.QueryProfiler;
2322

2423
import java.io.IOException;
2524
import java.util.Arrays;
26-
import java.util.Comparator;
2725
import java.util.Objects;
2826

2927
/**
@@ -60,16 +58,7 @@ public Query rewrite(IndexSearcher searcher) throws IOException {
6058
// Retrieve top k documents from the rescored query
6159
TopDocs topDocs = searcher.search(query, k);
6260
vectorOperations = topDocs.totalHits.value();
63-
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
64-
Arrays.sort(scoreDocs, Comparator.comparingInt(scoreDoc -> scoreDoc.doc));
65-
int[] docIds = new int[scoreDocs.length];
66-
float[] scores = new float[scoreDocs.length];
67-
for (int i = 0; i < scoreDocs.length; i++) {
68-
docIds[i] = scoreDocs[i].doc;
69-
scores[i] = scoreDocs[i].score;
70-
}
71-
72-
return new KnnScoreDocQuery(docIds, scores, searcher.getIndexReader());
61+
return new KnnScoreDocQuery(topDocs.scoreDocs, searcher.getIndexReader());
7362
}
7463

7564
public Query innerQuery() {

0 commit comments

Comments
 (0)