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 {