From 73e2dc22a3389e97739e0a9f29c0c3f1b8a7fd70 Mon Sep 17 00:00:00 2001 From: ldematte Date: Mon, 24 Nov 2025 14:56:05 +0100 Subject: [PATCH] Extend reflection to retrieve vector values from DefaultFlatVectorScorer$FloatScoringSupplier too --- .../server/cli/SystemJvmOptions.java | 1 + .../gpu/codec/ES92GpuHnswVectorsWriter.java | 2 +- .../reflect/VectorsFormatReflectionUtils.java | 28 ++++++++++++++----- .../xpack/gpu/GPUClientYamlTestSuiteIT.java | 1 + 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java index e5ba09402a0a7..accb5c20d35a1 100644 --- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java +++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java @@ -62,6 +62,7 @@ static List systemJvmOptions(Settings nodeSettings, final Map FLAT_CLOSEABLE_RANDOM_VECTOR_SCORER_SUPPLIER_CLASS; private static final Class SCALAR_QUANTIZED_CLOSEABLE_RANDOM_VECTOR_SCORER_SUPPLIER_CLASS; - private static final Class FLOAT_SCORING_SUPPLIER_CLASS; + private static final Class L99_FLOAT_SCORING_SUPPLIER_CLASS; + private static final Class DEFAULT_FLOAT_SCORING_SUPPLIER_CLASS; + static { try { FLAT_CLOSEABLE_RANDOM_VECTOR_SCORER_SUPPLIER_CLASS = Class.forName( @@ -39,11 +42,17 @@ public class VectorsFormatReflectionUtils { RandomVectorScorerSupplier.class ); - FLOAT_SCORING_SUPPLIER_CLASS = Class.forName( + L99_FLOAT_SCORING_SUPPLIER_CLASS = Class.forName( "org.apache.lucene.internal.vectorization.Lucene99MemorySegmentFloatVectorScorerSupplier" ); - lookup = MethodHandles.privateLookupIn(FLOAT_SCORING_SUPPLIER_CLASS, MethodHandles.lookup()); - FLOAT_VECTORS_HANDLE = lookup.findVarHandle(FLOAT_SCORING_SUPPLIER_CLASS, "values", FloatVectorValues.class); + lookup = MethodHandles.privateLookupIn(L99_FLOAT_SCORING_SUPPLIER_CLASS, MethodHandles.lookup()); + L99_FLOAT_VECTORS_HANDLE = lookup.findVarHandle(L99_FLOAT_SCORING_SUPPLIER_CLASS, "values", FloatVectorValues.class); + + DEFAULT_FLOAT_SCORING_SUPPLIER_CLASS = Class.forName( + "org.apache.lucene.codecs.hnsw.DefaultFlatVectorScorer$FloatScoringSupplier" + ); + lookup = MethodHandles.privateLookupIn(DEFAULT_FLOAT_SCORING_SUPPLIER_CLASS, MethodHandles.lookup()); + DEFAULT_FLOAT_VECTORS_HANDLE = lookup.findVarHandle(DEFAULT_FLOAT_SCORING_SUPPLIER_CLASS, "vectors", FloatVectorValues.class); SCALAR_QUANTIZED_CLOSEABLE_RANDOM_VECTOR_SCORER_SUPPLIER_CLASS = Class.forName( Lucene99ScalarQuantizedVectorsWriter.class.getCanonicalName() + "$ScalarQuantizedCloseableRandomVectorScorerSupplier" @@ -79,8 +88,13 @@ public static RandomVectorScorerSupplier getScalarQuantizedRandomVectorScorerInn } public static HasIndexSlice getFloatScoringSupplierVectorOrNull(RandomVectorScorerSupplier scorerSupplier) { - if (FLOAT_SCORING_SUPPLIER_CLASS.isAssignableFrom(scorerSupplier.getClass())) { - var vectorValues = FLOAT_VECTORS_HANDLE.get(scorerSupplier); + if (L99_FLOAT_SCORING_SUPPLIER_CLASS.isAssignableFrom(scorerSupplier.getClass())) { + var vectorValues = L99_FLOAT_VECTORS_HANDLE.get(scorerSupplier); + if (vectorValues instanceof HasIndexSlice indexSlice) { + return indexSlice; + } + } else if (DEFAULT_FLOAT_SCORING_SUPPLIER_CLASS.isAssignableFrom(scorerSupplier.getClass())) { + var vectorValues = DEFAULT_FLOAT_VECTORS_HANDLE.get(scorerSupplier); if (vectorValues instanceof HasIndexSlice indexSlice) { return indexSlice; } diff --git a/x-pack/plugin/gpu/src/yamlRestTest/java/org/elasticsearch/xpack/gpu/GPUClientYamlTestSuiteIT.java b/x-pack/plugin/gpu/src/yamlRestTest/java/org/elasticsearch/xpack/gpu/GPUClientYamlTestSuiteIT.java index d2cf42574e99e..f30edcfac69de 100644 --- a/x-pack/plugin/gpu/src/yamlRestTest/java/org/elasticsearch/xpack/gpu/GPUClientYamlTestSuiteIT.java +++ b/x-pack/plugin/gpu/src/yamlRestTest/java/org/elasticsearch/xpack/gpu/GPUClientYamlTestSuiteIT.java @@ -33,6 +33,7 @@ private static ElasticsearchCluster createCluster() { .setting("xpack.security.enabled", "false") // Needed to get access to raw vectors from Lucene scorers .jvmArg("--add-opens=org.apache.lucene.core/org.apache.lucene.codecs.lucene99=org.elasticsearch.server") + .jvmArg("--add-opens=org.apache.lucene.core/org.apache.lucene.codecs.hnsw=org.elasticsearch.server") .jvmArg("--add-opens=org.apache.lucene.core/org.apache.lucene.internal.vectorization=org.elasticsearch.server"); var libraryPath = System.getenv("LD_LIBRARY_PATH");