feat(retriever): 接入 Apache Doris 4.1 作为向量数据库
为 RetrieveEngine 体系新增 Doris 后端,与现有 Qdrant/Milvus/Weaviate
等保持完整能力对齐:向量检索、关键词检索、健康检查、环境变量与多实例
DB 配置、前端类型注册、单元测试、Docker Compose 模板。
实现要点:
- 协议分工:主链路用 MySQL 协议(database/sql + go-sql-driver/mysql)
做 DDL / 查询 / 删除;批量更新走 Stream Load HTTP API,并启用
partial_update=true、merge_type=APPEND,自动按 1MiB 切分批次并处理
307 重定向。
- 表结构:UNIQUE KEY(id) + enable_unique_key_merge_on_write=true 以
支持 upsert/部分列更新;按维度分表(<base>_<dim>),每张表上建
HNSW ANN 索引(metric_type=cosine_distance)和 INVERTED 索引
(parser=chinese)。
- 分数语义:使用 cosine_distance_approximate,再以 1 - dist 转换为
"越大越相似",与现有 KVHybridRetrieveEngine 约定一致。
- 异步索引:ANN 索引为后台构建,ensureTable 通过轮询 SHOW INDEX 等
待索引就绪后再放行写入,避免首次检索召回为空。
- ARRAY<FLOAT> 序列化:go-sql-driver/mysql 不支持数组占位符,
embeddingLiteral 将 []float32 转成 SQL 字面量字符串再拼接。
新增文件:
- internal/application/repository/retriever/doris/{structs,schema,
query,repository,streamload,repository_test}.go
- scripts/e2e-doris.sh:E2E 验证清单
- docs/wiki/集成扩展/Doris改动与上游同步.md:fork-and-rebase 工作流
与改动清单
修改文件(接线 + 文档):
- internal/types/{retriever,tenant,vectorstore}.go:新增
DorisRetrieverEngineType、env 解析、表单 schema 与索引参数校验
- internal/container/{container,engine_factory}.go:环境变量驱动
与 VectorStore 配置驱动两条路径都支持 Doris
- internal/application/service/vectorstore{,_healthcheck}.go:连接
校验 + Ping/Version 健康检查
- docker-compose.yml:新增 doris-fe / doris-be 服务(profile=doris)
- .env.example:DORIS_* 环境变量与示例
- docs/{使用其他向量数据库,wiki/集成扩展/集成向量数据库}.md:
使用说明与索引/分数行为说明
依赖:go.mod/go.sum 新增 github.com/go-sql-driver/mysql(运行时)和
github.com/DATA-DOG/go-sqlmock(测试)。
测试:repository 层 SQL 形状、Stream Load HTTP 行为、whereBuilder
逻辑、embeddingLiteral 往返、健康检查错误路径均有单测覆盖。
This commit is contained in:
+20
-1
@@ -120,7 +120,7 @@ OLLAMA_BASE_URL=http://host.docker.internal:11434
|
||||
# 主数据库类型(postgres/mysql)
|
||||
DB_DRIVER=postgres
|
||||
|
||||
# 向量存储类型(postgres/elasticsearch_v7/elasticsearch_v8/qdrant/milvus/weaviate)
|
||||
# 向量存储类型(postgres/elasticsearch_v7/elasticsearch_v8/qdrant/milvus/weaviate/doris)
|
||||
RETRIEVE_DRIVER=postgres
|
||||
|
||||
# 允许用户使用哪些文件存储类型,使用逗号分隔,留空则允许所有类型的存储
|
||||
@@ -425,6 +425,25 @@ DOCREADER_TRANSPORT=grpc
|
||||
# Weaviate 数据库名称(可选)
|
||||
#WEAVIATE_COLLECTION=your_weaviate_db_name
|
||||
|
||||
# 如果使用 Apache Doris 4.1+ 作为向量存储,需要配置以下参数
|
||||
# Doris FE 的 MySQL 协议地址(host:port)。容器内推荐用服务名 doris-fe:9030。
|
||||
# DORIS_ADDR=doris-fe:9030
|
||||
|
||||
# Doris FE 的 HTTP 端口,用于 Stream Load 批量字段更新(partial update)。
|
||||
# DORIS_HTTP_PORT=8030
|
||||
|
||||
# Doris 目标数据库名(建库语句:CREATE DATABASE weknora;)
|
||||
# DORIS_DATABASE=weknora
|
||||
|
||||
# Doris 用户名(默认 root)
|
||||
# DORIS_USERNAME=root
|
||||
|
||||
# Doris 密码(默认空)
|
||||
# DORIS_PASSWORD=
|
||||
|
||||
# Doris 表前缀,对应每维度的物理表 <prefix>_<dim>
|
||||
# DORIS_TABLE_PREFIX=weknora_embeddings
|
||||
|
||||
# Tavily Search API Key(可选,启用 Tavily 网页搜索提供者)
|
||||
# TAVILY_API_KEY=tvly-your_tavily_api_key
|
||||
|
||||
|
||||
Reference in New Issue
Block a user