From 83b5927e6797204ae831c4e2281ec728ecc42722 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B0=8F=E5=A5=B6=E5=A5=B6=E8=8A=B1=E7=94=9F=E7=B1=B3?=
<279094122@qq.com>
Date: Tue, 3 Feb 2026 22:27:38 +0800
Subject: [PATCH] =?UTF-8?q?feat(weaviate):=20=E6=B7=BB=E5=8A=A0=20Weaviate?=
=?UTF-8?q?=20=E7=9F=A2=E9=87=8F=E5=AD=98=E5=82=A8=E7=9F=A5=E8=AF=86?=
=?UTF-8?q?=E5=BA=93=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
实现 Weaviate 矢量存储知识库的核心功能,包括:
- 文档的存储、检索和删除
- 支持元数据字段定义和过滤查询
- 集成外部 Embedding 模型生成向量
- 提供 GraphQL 查询接口封装
- 添加完整的单元测试和集成测试
---
.../solon-ai-repo-weaviate/docker-compose.yml | 22 +
.../solon-ai-repo-weaviate/pom.xml | 37 ++
.../ai/rag/repository/WeaviateRepository.java | 611 ++++++++++++++++++
.../rag/repository/weaviate/Additional.java | 37 ++
.../ai/rag/repository/weaviate/ClassInfo.java | 22 +
.../ai/rag/repository/weaviate/Data.java | 22 +
.../rag/repository/weaviate/DocumentData.java | 60 ++
.../ai/rag/repository/weaviate/FieldType.java | 14 +
.../weaviate/FilterTransformer.java | 284 ++++++++
.../repository/weaviate/GraphQLResponse.java | 34 +
.../repository/weaviate/MetadataField.java | 41 ++
.../repository/weaviate/SchemaResponse.java | 33 +
.../repository/weaviate/WeaviateClient.java | 201 ++++++
.../repo/weaviate/WeaviateRepositoryTest.java | 340 ++++++++++
14 files changed, 1758 insertions(+)
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/docker-compose.yml
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/pom.xml
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/WeaviateRepository.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/Additional.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/ClassInfo.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/Data.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/DocumentData.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/FieldType.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/FilterTransformer.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/GraphQLResponse.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/MetadataField.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/SchemaResponse.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/weaviate/WeaviateClient.java
create mode 100644 solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/test/java/features/ai/repo/weaviate/WeaviateRepositoryTest.java
diff --git a/solon-ai-rag-repositorys/solon-ai-repo-weaviate/docker-compose.yml b/solon-ai-rag-repositorys/solon-ai-repo-weaviate/docker-compose.yml
new file mode 100644
index 00000000..696a2b69
--- /dev/null
+++ b/solon-ai-rag-repositorys/solon-ai-repo-weaviate/docker-compose.yml
@@ -0,0 +1,22 @@
+version: '3.5'
+
+networks:
+ net:
+ driver: bridge
+services:
+ weaviate:
+ image: semitechnologies/weaviate:1.35.6
+ volumes:
+ - ./weaviate:/var/lib/weaviate
+ environment:
+ - QUERY_DEFAULTS_LIMIT=25
+ - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true
+ - PERSISTENCE_DATA_PATH=/var/lib/weaviate
+ - DEFAULT_VECTORIZER_MODULE=none
+ - ENABLE_MODULES=text2vec-openai,generative-openai
+ - CLUSTER_HOSTNAME=node1
+ ports:
+ - 8080:8080
+ - 50051:50051
+ networks:
+ - net
diff --git a/solon-ai-rag-repositorys/solon-ai-repo-weaviate/pom.xml b/solon-ai-rag-repositorys/solon-ai-repo-weaviate/pom.xml
new file mode 100644
index 00000000..cad62b82
--- /dev/null
+++ b/solon-ai-rag-repositorys/solon-ai-repo-weaviate/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+
+ org.noear
+ solon-ai-parent
+ 3.9.1-SNAPSHOT
+ ../../solon-ai-parent/pom.xml
+
+
+ solon-ai-repo-weaviate
+ ${project.artifactId}
+ jar
+
+
+
+ org.noear
+ solon-ai
+
+
+
+ org.noear
+ solon-logging-simple
+ test
+
+
+
+ org.noear
+ solon-test
+ test
+
+
+
+
diff --git a/solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/WeaviateRepository.java b/solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/WeaviateRepository.java
new file mode 100644
index 00000000..8463cb68
--- /dev/null
+++ b/solon-ai-rag-repositorys/solon-ai-repo-weaviate/src/main/java/org/noear/solon/ai/rag/repository/WeaviateRepository.java
@@ -0,0 +1,611 @@
+
+package org.noear.solon.ai.rag.repository;
+
+import org.noear.solon.Utils;
+import org.noear.solon.ai.embedding.EmbeddingModel;
+import org.noear.solon.ai.rag.Document;
+import org.noear.solon.ai.rag.RepositoryLifecycle;
+import org.noear.solon.ai.rag.RepositoryStorable;
+import org.noear.solon.ai.rag.repository.weaviate.*;
+import org.noear.solon.ai.rag.repository.weaviate.MetadataField;
+import org.noear.solon.ai.rag.util.ListUtil;
+import org.noear.solon.ai.rag.util.QueryCondition;
+import org.noear.solon.ai.rag.util.SimilarityUtil;
+import org.noear.solon.lang.Preview;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiConsumer;
+
+/**
+ * Weaviate 矢量存储知识库
+ * 基于 Weaviate REST / GraphQL 接口
+ *
+ * 说明:
+ * 1. 使用外部 EmbeddingModel 生成向量,通过 nearVector GraphQL 查询实现向量搜索;
+ * 2. 文档内容、元数据以属性形式写入 Weaviate,对应属性名为:
+ * - content: 文本内容
+ * - url: 文档原始地址(如果有)
+ * - 其他 metadata: 直接展开为属性;
+ * 3. Document.id 对应 Weaviate 对象的 uuid(使用我们生成的 uuid,传给 Weaviate)。
+ *
+ * @author 小奶奶花生米
+ * @since 3.1
+ */
+@Preview("3.1")
+public class WeaviateRepository implements RepositoryStorable, RepositoryLifecycle {
+
+ private static final String DEFAULT_COLLECTION_NAME = "solon_ai";
+
+ /**
+ * 基础配置
+ */
+ private final Builder config;
+ private final WeaviateClient client;
+
+ private WeaviateRepository(Builder config) {
+ this.config = config;
+ if (config.token != null) {
+ this.client = new WeaviateClient(config.baseUrl, config.token);
+ } else if (config.username != null && config.password != null) {
+ this.client = new WeaviateClient(config.baseUrl, config.username, config.password);
+ } else {
+ this.client = new WeaviateClient(config.baseUrl);
+ }
+ }
+
+ /**
+ * 初始化仓库:创建 collection(class)Schema(如果不存在)
+ */
+ @Override
+ public void initRepository() throws Exception {
+ String className = getClassName();
+
+ // 检查 class 是否存在,不存在则创建
+ SchemaResponse schemaResponse = client.getSchema();
+ if (!schemaResponse.hasClass(className)) {
+ List