This is an automated email from the ASF dual-hosted git repository.

abenedetti pushed a commit to branch branch_10_0
in repository https://gitbox.apache.org/repos/asf/solr.git

commit 8b00ef93cf203bddb5a7b30117d9714b2322249e
Author: Puneet Ahuja <[email protected]>
AuthorDate: Thu Oct 16 22:13:41 2025 +0200

    SOLR-17948: Support indexing primitive float[] values for DenseVectorField 
(#3747)
    
    (cherry picked from commit 06a3b5e77e94771ee35c407cc90be0ce46d7a748)
---
 .../apache/solr/util/vector/DenseVectorParser.java | 14 ++++
 .../apache/solr/schema/DenseVectorFieldTest.java   | 78 ++++++++++++++++++++++
 2 files changed, 92 insertions(+)

diff --git 
a/solr/core/src/java/org/apache/solr/util/vector/DenseVectorParser.java 
b/solr/core/src/java/org/apache/solr/util/vector/DenseVectorParser.java
index 14c4b4ff653..82d57bc29c6 100644
--- a/solr/core/src/java/org/apache/solr/util/vector/DenseVectorParser.java
+++ b/solr/core/src/java/org/apache/solr/util/vector/DenseVectorParser.java
@@ -51,6 +51,20 @@ public abstract class DenseVectorParser {
   }
 
   protected void parseIndexVector() {
+    if (inputValue instanceof float[] fa) {
+      checkVectorDimension(fa.length);
+      for (int i = 0; i < dimension; i++) {
+        addNumberElement(fa[i]);
+      }
+      return;
+    }
+    if (inputValue instanceof double[] da) {
+      checkVectorDimension(da.length);
+      for (int i = 0; i < dimension; i++) {
+        addNumberElement((float) da[i]);
+      }
+      return;
+    }
     if (!(inputValue instanceof List<?> inputVector)) {
       throw new SolrException(
           SolrException.ErrorCode.BAD_REQUEST, "incorrect vector format. " + 
errorMessage());
diff --git 
a/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java 
b/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
index 7173bffbb9b..6b3c63ca331 100644
--- a/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
@@ -18,15 +18,26 @@ package org.apache.solr.schema;
 
 import static org.hamcrest.core.Is.is;
 
+import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.index.VectorEncoding;
 import org.apache.lucene.index.VectorSimilarityFunction;
+import org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec;
+import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.core.AbstractBadConfigTestBase;
+import org.apache.solr.handler.loader.JavabinLoader;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.update.CommitUpdateCommand;
+import org.apache.solr.update.processor.UpdateRequestProcessor;
+import org.apache.solr.update.processor.UpdateRequestProcessorChain;
 import org.apache.solr.util.vector.DenseVectorParser;
 import org.junit.Before;
 import org.junit.Test;
@@ -760,4 +771,71 @@ public class DenseVectorFieldTest extends 
AbstractBadConfigTestBase {
       deleteCore();
     }
   }
+
+  private void addDocWithJavaBin(SolrInputDocument doc) throws Exception {
+    UpdateRequest ur = new UpdateRequest();
+    ur.add(doc);
+
+    ByteArrayOutputStream bos = new ByteArrayOutputStream();
+    JavaBinUpdateRequestCodec codec = new JavaBinUpdateRequestCodec();
+    codec.marshal(ur, bos);
+
+    byte[] payload = bos.toByteArray();
+
+    ContentStreamBase.ByteArrayStream cs =
+        new ContentStreamBase.ByteArrayStream(payload, "application/javabin");
+
+    try (SolrQueryRequest sreq = req()) {
+      SolrQueryResponse srsp = new SolrQueryResponse();
+      UpdateRequestProcessorChain chain =
+          h.getCore().getUpdateProcessorChain(new ModifiableSolrParams());
+      try (UpdateRequestProcessor proc = chain.createProcessor(sreq, srsp)) {
+        new JavabinLoader().load(sreq, srsp, cs, proc);
+        proc.finish();
+      }
+      h.getCore().getUpdateHandler().commit(new CommitUpdateCommand(sreq, 
false));
+    }
+  }
+
+  @Test
+  public void testIndexingViaJavaBin() throws Exception {
+    try {
+      initCore("solrconfig-basic.xml", "schema-densevector.xml");
+
+      int variant = random().nextInt(3);
+      Object vector;
+      String id;
+
+      switch (variant) {
+        case 0:
+          vector = new float[] {1.1f, 2.2f, 3.3f, 4.4f};
+          id = "pf_jb";
+          break;
+        case 1:
+          vector = new double[] {1.1d, 2.2d, 3.3d, 4.4d};
+          id = "pd_jb";
+          break;
+        default:
+          vector = Arrays.asList(1.1f, 2.2f, 3.3f, 4.4f);
+          id = "lf_jb";
+          break;
+      }
+
+      SolrInputDocument doc = new SolrInputDocument();
+      doc.addField("id", id);
+      doc.addField("vector", vector);
+
+      addDocWithJavaBin(doc);
+
+      assertJQ(
+          req("q", "id:" + id, "fl", "vector"), 
"/response/docs/[0]/vector==[1.1,2.2,3.3,4.4]");
+
+      assertJQ(
+          req("q", "{!knn f=vector topK=1}[1.1,2.2,3.3,4.4]", "fl", "id"),
+          "/response/numFound==1",
+          "/response/docs/[0]/id==\"" + id + "\"");
+    } finally {
+      deleteCore();
+    }
+  }
 }

Reply via email to