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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new af1ed92a7112 CAMEL-23859: Add BATCH_CREATE, HYBRID_QUERY, BM25_QUERY, 
AGGREGATE operations to camel-weaviate
af1ed92a7112 is described below

commit af1ed92a71127abae1c62b7636e216a38b352d61
Author: JiriOndrusek <[email protected]>
AuthorDate: Fri Jul 10 16:17:02 2026 +0200

    CAMEL-23859: Add BATCH_CREATE, HYBRID_QUERY, BM25_QUERY, AGGREGATE 
operations to camel-weaviate
    
    Add four new operations leveraging Weaviate v6 client capabilities:
    - BATCH_CREATE: bulk insert via insertMany()
    - HYBRID_QUERY: combined keyword + vector search
    - BM25_QUERY: keyword-only BM25 search
    - AGGREGATE: collection-level aggregate statistics
    
    Closes #24577
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 .../apache/camel/catalog/components/weaviate.json  |   6 +-
 .../apache/camel/component/weaviate/weaviate.json  |   6 +-
 .../component/weaviate/WeaviateVectorDbAction.java |   4 +
 .../weaviate/WeaviateVectorDbHeaders.java          |   9 +-
 .../weaviate/WeaviateVectorDbProducer.java         | 101 ++++++++++++++
 .../component/weaviate/it/WeaviateContainerIT.java | 153 ++++++++++++++++++++-
 .../ROOT/pages/camel-4x-upgrade-guide-4_22.adoc    |   9 ++
 .../WeaviateVectorDbEndpointBuilderFactory.java    |  25 ++++
 8 files changed, 304 insertions(+), 9 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json
index ecd40e705bfd..3b2fdd54191b 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json
@@ -34,7 +34,7 @@
     "autowiredEnabled": { "index": 7, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
   "headers": {
-    "CamelWeaviateAction": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"enum": [ "CREATE_COLLECTION", "CREATE", "DELETE_BY_ID", "DELETE_COLLECTION", 
"QUERY", "QUERY_BY_ID", "UPDATE_BY_ID" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
action to be performed.", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#ACTION" },
+    "CamelWeaviateAction": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"enum": [ "AGGREGATE", "BATCH_CREATE", "BM25_QUERY", "CREATE_COLLECTION", 
"CREATE", "DELETE_BY_ID", "DELETE_COLLECTION", "HYBRID_QUERY", "QUERY", 
"QUERY_BY_ID", "UPDATE_BY_ID" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The action to be 
performed.", "constantName": "org.apache.camel [...]
     "CamelWeaviateTextFieldName": { "index": 1, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Text Field Name for 
Create\/Update\/Query operation", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#TEXT_FIELD_NAME" },
     "CamelweaviateVectorFieldName": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Vector Field Name for 
Create\/Update\/Query operation", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#VECTOR_FIELD_NAME" 
},
     "CamelWeaviateCollectionName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Collection Name for all operations", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#COLLECTION_NAME" },
@@ -44,7 +44,9 @@
     "CamelWeaviateQueryTopK": { "index": 7, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "Integer", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Query Top K", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#QUERY_TOP_K" },
     "CamelWeaviateUpdateWithMerge": { "index": 8, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "true", "description": "Merges 
properties into the object", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#UPDATE_WITH_MERGE" 
},
     "CamelWeaviateKeyName": { "index": 9, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Name for Create\/Update\/Query operation", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#KEY_NAME" },
-    "CamelWeaviateKeyValue": { "index": 10, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Value for Create\/Update\/Query operation", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#KEY_VALUE" }
+    "CamelWeaviateKeyValue": { "index": 10, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Value for Create\/Update\/Query operation", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#KEY_VALUE" },
+    "CamelWeaviateHybridAlpha": { "index": 11, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Float", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Alpha value for hybrid search (0.0 = 
pure BM25, 1.0 = pure vector)", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#HYBRID_ALPHA" },
+    "CamelWeaviateQueryVector": { "index": 12, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "List<Float>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Optional query vector for 
hybrid search (overrides server-side vectorizer)", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#QUERY_VECTOR" }
   },
   "properties": {
     "collection": { "index": 0, "kind": "path", "displayName": "Collection", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The collection Name" },
diff --git 
a/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json
 
b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json
index ecd40e705bfd..3b2fdd54191b 100644
--- 
a/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json
+++ 
b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json
@@ -34,7 +34,7 @@
     "autowiredEnabled": { "index": 7, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
   },
   "headers": {
-    "CamelWeaviateAction": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"enum": [ "CREATE_COLLECTION", "CREATE", "DELETE_BY_ID", "DELETE_COLLECTION", 
"QUERY", "QUERY_BY_ID", "UPDATE_BY_ID" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
action to be performed.", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#ACTION" },
+    "CamelWeaviateAction": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"enum": [ "AGGREGATE", "BATCH_CREATE", "BM25_QUERY", "CREATE_COLLECTION", 
"CREATE", "DELETE_BY_ID", "DELETE_COLLECTION", "HYBRID_QUERY", "QUERY", 
"QUERY_BY_ID", "UPDATE_BY_ID" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The action to be 
performed.", "constantName": "org.apache.camel [...]
     "CamelWeaviateTextFieldName": { "index": 1, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Text Field Name for 
Create\/Update\/Query operation", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#TEXT_FIELD_NAME" },
     "CamelweaviateVectorFieldName": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Vector Field Name for 
Create\/Update\/Query operation", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#VECTOR_FIELD_NAME" 
},
     "CamelWeaviateCollectionName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Collection Name for all operations", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#COLLECTION_NAME" },
@@ -44,7 +44,9 @@
     "CamelWeaviateQueryTopK": { "index": 7, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "Integer", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Query Top K", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#QUERY_TOP_K" },
     "CamelWeaviateUpdateWithMerge": { "index": 8, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "true", "description": "Merges 
properties into the object", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#UPDATE_WITH_MERGE" 
},
     "CamelWeaviateKeyName": { "index": 9, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Name for Create\/Update\/Query operation", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#KEY_NAME" },
-    "CamelWeaviateKeyValue": { "index": 10, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Value for Create\/Update\/Query operation", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#KEY_VALUE" }
+    "CamelWeaviateKeyValue": { "index": 10, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Value for Create\/Update\/Query operation", 
"constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#KEY_VALUE" },
+    "CamelWeaviateHybridAlpha": { "index": 11, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Float", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Alpha value for hybrid search (0.0 = 
pure BM25, 1.0 = pure vector)", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#HYBRID_ALPHA" },
+    "CamelWeaviateQueryVector": { "index": 12, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "List<Float>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Optional query vector for 
hybrid search (overrides server-side vectorizer)", "constantName": 
"org.apache.camel.component.weaviate.WeaviateVectorDbHeaders#QUERY_VECTOR" }
   },
   "properties": {
     "collection": { "index": 0, "kind": "path", "displayName": "Collection", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The collection Name" },
diff --git 
a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbAction.java
 
b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbAction.java
index fe08e353a5fc..f092f3dbe94d 100644
--- 
a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbAction.java
+++ 
b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbAction.java
@@ -17,10 +17,14 @@
 package org.apache.camel.component.weaviate;
 
 public enum WeaviateVectorDbAction {
+    AGGREGATE,
+    BATCH_CREATE,
+    BM25_QUERY,
     CREATE_COLLECTION,
     CREATE,
     DELETE_BY_ID,
     DELETE_COLLECTION,
+    HYBRID_QUERY,
     QUERY,
     QUERY_BY_ID,
     UPDATE_BY_ID
diff --git 
a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbHeaders.java
 
b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbHeaders.java
index 14cba44bc63a..f71b2479b587 100644
--- 
a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbHeaders.java
+++ 
b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbHeaders.java
@@ -21,7 +21,7 @@ import org.apache.camel.spi.Metadata;
 
 public class WeaviateVectorDbHeaders {
     @Metadata(description = "The action to be performed.", javaType = "String",
-              enums = 
"CREATE_COLLECTION,CREATE,DELETE_BY_ID,DELETE_COLLECTION,QUERY,QUERY_BY_ID,UPDATE_BY_ID")
+              enums = 
"AGGREGATE,BATCH_CREATE,BM25_QUERY,CREATE_COLLECTION,CREATE,DELETE_BY_ID,DELETE_COLLECTION,HYBRID_QUERY,QUERY,QUERY_BY_ID,UPDATE_BY_ID")
     public static final String ACTION = "CamelWeaviateAction";
 
     @Metadata(description = "Text Field Name for Create/Update/Query 
operation", javaType = "String")
@@ -54,4 +54,11 @@ public class WeaviateVectorDbHeaders {
     @Metadata(description = "Key Value for Create/Update/Query operation", 
javaType = "String")
     public static final String KEY_VALUE = "CamelWeaviateKeyValue";
 
+    @Metadata(description = "Alpha value for hybrid search (0.0 = pure BM25, 
1.0 = pure vector)", javaType = "Float")
+    public static final String HYBRID_ALPHA = "CamelWeaviateHybridAlpha";
+
+    @Metadata(description = "Optional query vector for hybrid search 
(overrides server-side vectorizer)",
+              javaType = "List<Float>")
+    public static final String QUERY_VECTOR = "CamelWeaviateQueryVector";
+
 }
diff --git 
a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java
 
b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java
index 0e7b75687c4b..3107bb80664f 100644
--- 
a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java
+++ 
b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java
@@ -25,6 +25,9 @@ import io.weaviate.client6.v1.api.WeaviateClient;
 import io.weaviate.client6.v1.api.collections.CollectionHandle;
 import io.weaviate.client6.v1.api.collections.Vectors;
 import io.weaviate.client6.v1.api.collections.WeaviateObject;
+import io.weaviate.client6.v1.api.collections.aggregate.AggregateResponse;
+import io.weaviate.client6.v1.api.collections.data.InsertManyResponse;
+import io.weaviate.client6.v1.api.collections.query.NearVector;
 import io.weaviate.client6.v1.api.collections.query.QueryResponse;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
@@ -68,6 +71,9 @@ public class WeaviateVectorDbProducer extends DefaultProducer 
{
                 case CREATE:
                     create(exchange);
                     break;
+                case BATCH_CREATE:
+                    batchCreate(exchange);
+                    break;
                 case UPDATE_BY_ID:
                     updateById(exchange);
                     break;
@@ -83,6 +89,15 @@ public class WeaviateVectorDbProducer extends 
DefaultProducer {
                 case QUERY_BY_ID:
                     queryById(exchange);
                     break;
+                case HYBRID_QUERY:
+                    hybridQuery(exchange);
+                    break;
+                case BM25_QUERY:
+                    bm25Query(exchange);
+                    break;
+                case AGGREGATE:
+                    aggregate(exchange);
+                    break;
                 default:
                     throw new UnsupportedOperationException("Unsupported 
action: " + action.name());
             }
@@ -220,6 +235,92 @@ public class WeaviateVectorDbProducer extends 
DefaultProducer {
         populateResponse(result, exchange);
     }
 
+    @SuppressWarnings("unchecked")
+    private void batchCreate(Exchange exchange) throws Exception {
+        final Message in = exchange.getMessage();
+        List<WeaviateObject<Map<String, Object>>> objects = 
in.getMandatoryBody(List.class);
+
+        String collectionName = resolveCollectionName(in);
+
+        CollectionHandle<Map<String, Object>> collection = 
client.collections.use(collectionName);
+
+        InsertManyResponse result = collection.data.insertMany(objects);
+        populateResponse(result, exchange);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void hybridQuery(Exchange exchange) throws Exception {
+        final Message in = exchange.getMessage();
+        String queryText = in.getMandatoryBody(String.class);
+
+        int topK = in.getHeader(WeaviateVectorDbHeaders.QUERY_TOP_K, 10, 
Integer.class);
+        Float alpha = in.getHeader(WeaviateVectorDbHeaders.HYBRID_ALPHA, 
Float.class);
+        List<Float> queryVector = 
in.getHeader(WeaviateVectorDbHeaders.QUERY_VECTOR, List.class);
+
+        String collectionName = resolveCollectionName(in);
+
+        CollectionHandle<Map<String, Object>> collection = 
client.collections.use(collectionName);
+
+        HashMap<String, Object> fieldToSearch = 
in.getHeader(WeaviateVectorDbHeaders.FIELDS, HashMap.class);
+
+        QueryResponse<Map<String, Object>> result = (QueryResponse<Map<String, 
Object>>) collection.query.hybrid(
+                queryText, h -> {
+                    h.limit(topK);
+                    if (alpha != null) {
+                        h.alpha(alpha);
+                    }
+                    if (queryVector != null) {
+                        float[] primitiveVector = 
toPrimitiveFloatArray(queryVector.toArray(new Float[0]));
+                        h.nearVector(NearVector.of(primitiveVector));
+                    }
+                    if (fieldToSearch != null) {
+                        h.returnProperties(fieldToSearch.keySet().toArray(new 
String[0]));
+                    }
+                    return h;
+                });
+
+        populateResponse(result, exchange);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void bm25Query(Exchange exchange) throws Exception {
+        final Message in = exchange.getMessage();
+        String queryText = in.getMandatoryBody(String.class);
+
+        int topK = in.getHeader(WeaviateVectorDbHeaders.QUERY_TOP_K, 10, 
Integer.class);
+
+        String collectionName = resolveCollectionName(in);
+
+        CollectionHandle<Map<String, Object>> collection = 
client.collections.use(collectionName);
+
+        HashMap<String, Object> fieldToSearch = 
in.getHeader(WeaviateVectorDbHeaders.FIELDS, HashMap.class);
+
+        QueryResponse<Map<String, Object>> result;
+        if (fieldToSearch != null) {
+            String[] returnProps = fieldToSearch.keySet().toArray(new 
String[0]);
+            result = (QueryResponse<Map<String, Object>>) 
collection.query.bm25(queryText,
+                    b -> b.limit(topK).returnProperties(returnProps));
+        } else {
+            result = (QueryResponse<Map<String, Object>>) 
collection.query.bm25(queryText,
+                    b -> b.limit(topK));
+        }
+
+        populateResponse(result, exchange);
+    }
+
+    private void aggregate(Exchange exchange) throws Exception {
+        final Message in = exchange.getMessage();
+
+        String collectionName = resolveCollectionName(in);
+
+        CollectionHandle<Map<String, Object>> collection = 
client.collections.use(collectionName);
+
+        AggregateResponse result = (AggregateResponse) 
collection.aggregate.overAll(
+                a -> a.includeTotalCount(true));
+
+        populateResponse(result, exchange);
+    }
+
     // ***************************************
     //
     // Helpers
diff --git 
a/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java
 
b/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java
index f487fb156a05..2b54d4e38af1 100644
--- 
a/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java
+++ 
b/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java
@@ -22,7 +22,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+import io.weaviate.client6.v1.api.collections.Vectors;
 import io.weaviate.client6.v1.api.collections.WeaviateObject;
+import io.weaviate.client6.v1.api.collections.aggregate.AggregateResponse;
+import io.weaviate.client6.v1.api.collections.data.InsertManyResponse;
 import io.weaviate.client6.v1.api.collections.query.QueryResponse;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.weaviate.WeaviateTestSupport;
@@ -93,8 +96,150 @@ public class WeaviateContainerIT extends 
WeaviateTestSupport {
         assertThat(CREATEID).isNotNull();
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    @Order(3)
+    public void batchCreate() {
+
+        WeaviateObject<Map<String, Object>> obj1 = new 
WeaviateObject.Builder<Map<String, Object>>()
+                .properties(Map.of("sky", "green", "age", "10"))
+                .vectors(Vectors.of(new float[] { 4.0f, 5.0f, 6.0f }))
+                .build();
+        WeaviateObject<Map<String, Object>> obj2 = new 
WeaviateObject.Builder<Map<String, Object>>()
+                .properties(Map.of("sky", "red", "age", "20"))
+                .vectors(Vectors.of(new float[] { 7.0f, 8.0f, 9.0f }))
+                .build();
+
+        Exchange result = fluentTemplate
+                .to(getUri())
+                .withHeader(WeaviateVectorDbHeaders.ACTION, 
WeaviateVectorDbAction.BATCH_CREATE)
+                .withBody(List.of(obj1, obj2))
+                .withHeader(WeaviateVectorDbHeaders.COLLECTION_NAME, 
COLLECTION)
+                .request(Exchange.class);
+
+        assertThat(result).isNotNull();
+        assertThat(result.getException()).isNull();
+
+        InsertManyResponse res = (InsertManyResponse) result.getIn().getBody();
+        assertThat(res.uuids()).hasSize(2);
+        assertThat(res.errors()).isEmpty();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    @Order(4)
+    public void hybridQuery() {
+
+        Exchange result = fluentTemplate
+                .to(getUri())
+                .withHeader(WeaviateVectorDbHeaders.ACTION, 
WeaviateVectorDbAction.HYBRID_QUERY)
+                .withBody("blue")
+                .withHeader(WeaviateVectorDbHeaders.COLLECTION_NAME, 
COLLECTION)
+                .withHeader(WeaviateVectorDbHeaders.QUERY_TOP_K, 10)
+                .withHeader(WeaviateVectorDbHeaders.HYBRID_ALPHA, 0.5f)
+                .withHeader(WeaviateVectorDbHeaders.QUERY_VECTOR, 
Arrays.asList(1.0f, 2.0f, 3.0f))
+                .request(Exchange.class);
+
+        assertThat(result).isNotNull();
+        assertThat(result.getException()).isNull();
+
+        QueryResponse<Map<String, Object>> queryResponse
+                = (QueryResponse<Map<String, Object>>) 
result.getIn().getBody();
+        assertThat(queryResponse).isNotNull();
+        assertThat(queryResponse.objects()).isNotEmpty();
+        
assertThat(queryResponse.objects().get(0).properties()).containsKey("sky");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    @Order(5)
+    public void hybridQueryWithoutVector() {
+
+        Exchange result = fluentTemplate
+                .to(getUri())
+                .withHeader(WeaviateVectorDbHeaders.ACTION, 
WeaviateVectorDbAction.HYBRID_QUERY)
+                .withBody("blue")
+                .withHeader(WeaviateVectorDbHeaders.COLLECTION_NAME, 
COLLECTION)
+                .withHeader(WeaviateVectorDbHeaders.QUERY_TOP_K, 10)
+                .withHeader(WeaviateVectorDbHeaders.HYBRID_ALPHA, 0.0f)
+                .request(Exchange.class);
+
+        assertThat(result).isNotNull();
+        assertThat(result.getException()).isNull();
+
+        QueryResponse<Map<String, Object>> queryResponse
+                = (QueryResponse<Map<String, Object>>) 
result.getIn().getBody();
+        assertThat(queryResponse).isNotNull();
+        assertThat(queryResponse.objects()).isNotNull();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    @Order(6)
+    public void bm25Query() {
+
+        Exchange result = fluentTemplate
+                .to(getUri())
+                .withHeader(WeaviateVectorDbHeaders.ACTION, 
WeaviateVectorDbAction.BM25_QUERY)
+                .withBody("blue")
+                .withHeader(WeaviateVectorDbHeaders.COLLECTION_NAME, 
COLLECTION)
+                .withHeader(WeaviateVectorDbHeaders.QUERY_TOP_K, 10)
+                .request(Exchange.class);
+
+        assertThat(result).isNotNull();
+        assertThat(result.getException()).isNull();
+
+        QueryResponse<Map<String, Object>> queryResponse
+                = (QueryResponse<Map<String, Object>>) 
result.getIn().getBody();
+        assertThat(queryResponse).isNotNull();
+        assertThat(queryResponse.objects()).isNotNull();
+    }
+
+    @SuppressWarnings("unchecked")
     @Test
     @Order(7)
+    public void bm25QueryWithFields() {
+
+        HashMap<String, Object> fields = new HashMap<>();
+        fields.put("sky", null);
+
+        Exchange result = fluentTemplate
+                .to(getUri())
+                .withHeader(WeaviateVectorDbHeaders.ACTION, 
WeaviateVectorDbAction.BM25_QUERY)
+                .withBody("blue")
+                .withHeader(WeaviateVectorDbHeaders.COLLECTION_NAME, 
COLLECTION)
+                .withHeader(WeaviateVectorDbHeaders.QUERY_TOP_K, 10)
+                .withHeader(WeaviateVectorDbHeaders.FIELDS, fields)
+                .request(Exchange.class);
+
+        assertThat(result).isNotNull();
+        assertThat(result.getException()).isNull();
+
+        QueryResponse<Map<String, Object>> queryResponse
+                = (QueryResponse<Map<String, Object>>) 
result.getIn().getBody();
+        assertThat(queryResponse).isNotNull();
+        assertThat(queryResponse.objects()).isNotNull();
+    }
+
+    @Test
+    @Order(8)
+    public void aggregate() {
+
+        Exchange result = fluentTemplate
+                .to(getUri())
+                .withHeader(WeaviateVectorDbHeaders.ACTION, 
WeaviateVectorDbAction.AGGREGATE)
+                .withHeader(WeaviateVectorDbHeaders.COLLECTION_NAME, 
COLLECTION)
+                .request(Exchange.class);
+
+        assertThat(result).isNotNull();
+        assertThat(result.getException()).isNull();
+
+        AggregateResponse res = (AggregateResponse) result.getIn().getBody();
+        assertThat(res.totalCount()).isGreaterThanOrEqualTo(3);
+    }
+
+    @Test
+    @Order(9)
     public void updateById() {
 
         List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.0f);
@@ -118,7 +263,7 @@ public class WeaviateContainerIT extends 
WeaviateTestSupport {
     }
 
     @Test
-    @Order(8)
+    @Order(10)
     public void queryById() {
 
         Exchange result = fluentTemplate.to(getUri())
@@ -143,7 +288,7 @@ public class WeaviateContainerIT extends 
WeaviateTestSupport {
 
     @SuppressWarnings("unchecked")
     @Test
-    @Order(8)
+    @Order(11)
     public void queryByVector() {
 
         List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.2f);
@@ -171,7 +316,7 @@ public class WeaviateContainerIT extends 
WeaviateTestSupport {
     }
 
     @Test
-    @Order(9)
+    @Order(12)
     public void deleteById() {
 
         Exchange result = fluentTemplate
@@ -188,7 +333,7 @@ public class WeaviateContainerIT extends 
WeaviateTestSupport {
     }
 
     @Test
-    @Order(10)
+    @Order(13)
     public void deleteCollection() {
         Exchange result = fluentTemplate
                 .to(getUri())
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
index ed6963bf53cb..1b69f6c9068b 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
@@ -287,3 +287,12 @@ surface on the first operation instead of during endpoint 
initialization.
 
 The v6 client no longer supports HTTP proxy configuration.
 The `proxyHost`, `proxyPort`, and `proxyScheme` endpoint options have been 
removed.
+
+==== New operations
+
+Four new operations have been added to the Weaviate component, leveraging v6 
client capabilities:
+
+* `BATCH_CREATE` — Insert multiple objects in a single call. The exchange body 
must be a `List<WeaviateObject<Map<String, Object>>>`. Returns an 
`InsertManyResponse`.
+* `HYBRID_QUERY` — Keyword + vector hybrid search. The exchange body is the 
query text (`String`). Supports `CamelWeaviateQueryTopK` (default 10), 
`CamelWeaviateHybridAlpha` (0.0 = pure BM25, 1.0 = pure vector), 
`CamelWeaviateQueryVector` (optional pre-computed vector to override 
server-side vectorizer), and `CamelWeaviateFields` headers. Returns a 
`QueryResponse<Map<String, Object>>`.
+* `BM25_QUERY` — Keyword-only (BM25) search. The exchange body is the query 
text (`String`). Supports `CamelWeaviateQueryTopK` and `CamelWeaviateFields` 
headers. Returns a `QueryResponse<Map<String, Object>>`.
+* `AGGREGATE` — Returns aggregate statistics for a collection. No body 
required. Returns an `AggregateResponse` with `totalCount()` and per-property 
aggregations.
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java
index 6ffa4a7f1690..0914e951e05c 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java
@@ -391,6 +391,31 @@ public interface WeaviateVectorDbEndpointBuilderFactory {
         public String weaviateKeyValue() {
             return "CamelWeaviateKeyValue";
         }
+        /**
+         * Alpha value for hybrid search (0.0 = pure BM25, 1.0 = pure vector).
+         * 
+         * The option is a: {@code Float} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code WeaviateHybridAlpha}.
+         */
+        public String weaviateHybridAlpha() {
+            return "CamelWeaviateHybridAlpha";
+        }
+        /**
+         * Optional query vector for hybrid search (overrides server-side
+         * vectorizer).
+         * 
+         * The option is a: {@code List<Float>} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code WeaviateQueryVector}.
+         */
+        public String weaviateQueryVector() {
+            return "CamelWeaviateQueryVector";
+        }
     }
     static WeaviateVectorDbEndpointBuilder endpointBuilder(String 
componentName, String path) {
         class WeaviateVectorDbEndpointBuilderImpl extends 
AbstractEndpointBuilder implements WeaviateVectorDbEndpointBuilder, 
AdvancedWeaviateVectorDbEndpointBuilder {

Reply via email to