Skip to content

Commit 6f5606c

Browse files
committed
Expose mergePolicy in KnnIndexTester
1 parent ab7bd9b commit 6f5606c

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

qa/vector/src/main/java/org/elasticsearch/test/knn/CmdLineArgs.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ record CmdLineArgs(
5252
int quantizeBits,
5353
VectorEncoding vectorEncoding,
5454
int dimensions,
55-
boolean earlyTermination
55+
boolean earlyTermination,
56+
String mergePolicy
5657
) implements ToXContentObject {
5758

5859
static final ParseField DOC_VECTORS_FIELD = new ParseField("doc_vectors");
@@ -79,6 +80,7 @@ record CmdLineArgs(
7980
static final ParseField EARLY_TERMINATION_FIELD = new ParseField("early_termination");
8081
static final ParseField FILTER_SELECTIVITY_FIELD = new ParseField("filter_selectivity");
8182
static final ParseField SEED_FIELD = new ParseField("seed");
83+
static final ParseField MERGE_POLICY_FIELD = new ParseField("merge_policy");
8284

8385
static CmdLineArgs fromXContent(XContentParser parser) throws IOException {
8486
Builder builder = PARSER.apply(parser, null);
@@ -112,6 +114,7 @@ static CmdLineArgs fromXContent(XContentParser parser) throws IOException {
112114
PARSER.declareBoolean(Builder::setEarlyTermination, EARLY_TERMINATION_FIELD);
113115
PARSER.declareFloat(Builder::setFilterSelectivity, FILTER_SELECTIVITY_FIELD);
114116
PARSER.declareLong(Builder::setSeed, SEED_FIELD);
117+
PARSER.declareString(Builder::setMergePolicy, MERGE_POLICY_FIELD);
115118
}
116119

117120
@Override
@@ -179,6 +182,7 @@ static class Builder {
179182
private boolean earlyTermination;
180183
private float filterSelectivity = 1f;
181184
private long seed = 1751900822751L;
185+
private String mergePolicy = null;
182186

183187
public Builder setDocVectors(List<String> docVectors) {
184188
if (docVectors == null || docVectors.isEmpty()) {
@@ -304,6 +308,11 @@ public Builder setSeed(long seed) {
304308
return this;
305309
}
306310

311+
public Builder setMergePolicy(String mergePolicy) {
312+
this.mergePolicy = mergePolicy;
313+
return this;
314+
}
315+
307316
public CmdLineArgs build() {
308317
if (docVectors == null) {
309318
throw new IllegalArgumentException("Document vectors path must be provided");
@@ -337,7 +346,8 @@ public CmdLineArgs build() {
337346
quantizeBits,
338347
vectorEncoding,
339348
dimensions,
340-
earlyTermination
349+
earlyTermination,
350+
mergePolicy
341351
);
342352
}
343353
}

qa/vector/src/main/java/org/elasticsearch/test/knn/KnnIndexTester.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
import org.apache.lucene.codecs.KnnVectorsFormat;
1616
import org.apache.lucene.codecs.lucene101.Lucene101Codec;
1717
import org.apache.lucene.codecs.lucene99.Lucene99HnswVectorsFormat;
18+
import org.apache.lucene.index.LogByteSizeMergePolicy;
19+
import org.apache.lucene.index.MergePolicy;
20+
import org.apache.lucene.index.NoMergePolicy;
21+
import org.apache.lucene.index.TieredMergePolicy;
1822
import org.elasticsearch.cli.ProcessInfo;
1923
import org.elasticsearch.common.Strings;
2024
import org.elasticsearch.common.logging.LogConfigurator;
@@ -196,6 +200,16 @@ public static void main(String[] args) throws Exception {
196200
logger.info("Running KNN index tester with arguments: " + cmdLineArgs);
197201
Codec codec = createCodec(cmdLineArgs);
198202
Path indexPath = PathUtils.get(formatIndexPath(cmdLineArgs));
203+
MergePolicy mergePolicy = null;
204+
if (cmdLineArgs.mergePolicy() != null && cmdLineArgs.mergePolicy().isEmpty() == false) {
205+
if ("tmp".equalsIgnoreCase(cmdLineArgs.mergePolicy())) {
206+
mergePolicy = new TieredMergePolicy();
207+
} else if ("lbmp".equalsIgnoreCase(cmdLineArgs.mergePolicy())) {
208+
mergePolicy = new LogByteSizeMergePolicy();
209+
} else if ("no".equalsIgnoreCase(cmdLineArgs.mergePolicy())) {
210+
mergePolicy = NoMergePolicy.INSTANCE;
211+
}
212+
}
199213
if (cmdLineArgs.reindex() || cmdLineArgs.forceMerge()) {
200214
KnnIndexer knnIndexer = new KnnIndexer(
201215
cmdLineArgs.docVectors(),
@@ -205,7 +219,8 @@ public static void main(String[] args) throws Exception {
205219
cmdLineArgs.vectorEncoding(),
206220
cmdLineArgs.dimensions(),
207221
cmdLineArgs.vectorSpace(),
208-
cmdLineArgs.numDocs()
222+
cmdLineArgs.numDocs(),
223+
mergePolicy
209224
);
210225
if (cmdLineArgs.reindex() == false && Files.exists(indexPath) == false) {
211226
throw new IllegalArgumentException("Index path does not exist: " + indexPath);

qa/vector/src/main/java/org/elasticsearch/test/knn/KnnIndexer.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.lucene.index.IndexReader;
3232
import org.apache.lucene.index.IndexWriter;
3333
import org.apache.lucene.index.IndexWriterConfig;
34+
import org.apache.lucene.index.MergePolicy;
3435
import org.apache.lucene.index.VectorEncoding;
3536
import org.apache.lucene.index.VectorSimilarityFunction;
3637
import org.apache.lucene.store.FSDirectory;
@@ -69,6 +70,7 @@ class KnnIndexer {
6970
private final Codec codec;
7071
private final int numDocs;
7172
private final int numIndexThreads;
73+
private final MergePolicy mergePolicy;
7274

7375
KnnIndexer(
7476
List<Path> docsPath,
@@ -78,7 +80,8 @@ class KnnIndexer {
7880
VectorEncoding vectorEncoding,
7981
int dim,
8082
VectorSimilarityFunction similarityFunction,
81-
int numDocs
83+
int numDocs,
84+
MergePolicy mergePolicy
8285
) {
8386
this.docsPath = docsPath;
8487
this.indexPath = indexPath;
@@ -88,6 +91,7 @@ class KnnIndexer {
8891
this.dim = dim;
8992
this.similarityFunction = similarityFunction;
9093
this.numDocs = numDocs;
94+
this.mergePolicy = mergePolicy;
9195
}
9296

9397
void numSegments(KnnIndexTester.Results result) {
@@ -103,7 +107,9 @@ void createIndex(KnnIndexTester.Results result) throws IOException, InterruptedE
103107
iwc.setCodec(codec);
104108
iwc.setRAMBufferSizeMB(WRITER_BUFFER_MB);
105109
iwc.setUseCompoundFile(false);
106-
110+
if (mergePolicy != null) {
111+
iwc.setMergePolicy(mergePolicy);
112+
}
107113
iwc.setMaxFullFlushMergeWaitMillis(0);
108114

109115
iwc.setInfoStream(new PrintStreamInfoStream(System.out) {

0 commit comments

Comments
 (0)