Weaviate 本地 Docker 部署与向量检索入门

Weaviate 是一个开源的向量数据库,核心用途是把文本、图片等数据转成向量后做相似度检索。
对新手来说,最省事的起步方式是用 Docker 拉起单节点服务,再通过 HTTP 接口完成建库、导入和查询。
下面按实际落地顺序讲清楚每一步做什么、在哪里看结果。

跑起来之前先确认两件事

Weaviate 单节点模式对机器要求不高,但需要满足两个前提:

  • 已安装 Docker,执行 docker version 能看到 Client 和 Server 信息。
  • 宿主机至少留出 2GB 内存,因为向量化模块和索引会占用额外内存。

如果服务器开着防火墙,需要放行 8080(REST/GraphQL 接口)和 50051(gRPC 接口)。
只在本机测试可以跳过这步。

用 Docker 启动单节点 Weaviate

先建一个工作目录,把数据卷挂载到宿主机,避免容器删除后数据丢失:

mkdir -p /opt/weaviate/data
cd /opt/weaviate

然后启动容器。
下面这条命令启用了 text2vec-transformers 模块,它会自动下载向量化模型,第一次启动会慢一些:

docker run -d \
  --name weaviate \
  -p 8080:8080 \
  -p 50051:50051 \
  -v /opt/weaviate/data:/var/lib/weaviate \
  -e QUERY_DEFAULTS_LIMIT=25 \
  -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
  -e PERSISTENCE_DATA_PATH=/var/lib/weaviate \
  -e DEFAULT_VECTORIZER_MODULE=text2vec-transformers \
  -e ENABLE_MODULES=text2vec-transformers \
  -e TEXT2VEC_TRANSFORMERS_INFERENCE_API=http://t2v-transformers:8080 \
  semitechnologies/weaviate:latest

注意:上面命令里的 t2v-transformers 是另一个容器的主机名。
如果只启动 Weaviate 本体,向量化模块会连不上。
更稳妥的做法是用 Docker Compose 同时启动 weaviate 和 t2v-transformers 两个服务,这里不展开完整 compose 文件,只提醒新手不要漏掉向量化容器。

启动后检查容器状态:

docker ps | grep weaviate
docker logs weaviate --tail 50

日志里出现 server started 或监听 8080 的提示,说明服务已经起来了。
浏览器访问 http://服务器IP:8080/v1/meta,能返回 JSON 就代表接口正常。

建一个 collection 并导入第一条数据

Weaviate 用 collection 组织数据,类似关系库里的表。
下面用 REST 接口创建一个叫 Article 的 collection,并指定用 text2vec-transformers 自动向量化 title 和 content 字段:

curl -X POST http://localhost:8080/v1/schema \
  -H "Content-Type: application/json" \
  -d '{
    "class": "Article",
    "vectorizer": "text2vec-transformers",
    "properties": [
      {"name": "title", "dataType": ["text"]},
      {"name": "content", "dataType": ["text"]}
    ]
  }'

创建成功后,导入一条数据:

curl -X POST http://localhost:8080/v1/objects \
  -H "Content-Type: application/json" \
  -d '{
    "class": "Article",
    "properties": {
      "title": "服务器磁盘满了怎么清理",
      "content": "先查大文件,再清日志和缓存,最后检查 inode 使用率。"
    }
  }'

返回结果里会带一个 id,说明写入成功。
如果返回 422,通常是字段名和 schema 对不上,回到上一步检查 properties 定义。

执行一次相似度查询并验证结果

用 GraphQL 接口做语义检索,查和“磁盘空间不足”最接近的文章:

curl -X POST http://localhost:8080/v1/graphql \
  -H "Content-Type: application/json" \
  -d '{
    "query": "{ Get { Article(nearText: {concepts: [\"磁盘空间不足\"]}, limit: 3) { title content _additional { distance } } } }"
  }'

期望结果是刚才导入的那条数据排在前面,distance 越小表示越相似。
如果返回空数组,优先检查两件事:collection 名称大小写是否一致、向量化容器是否在运行(docker ps 看 t2v-transformers 状态)。

另一种验证方式是直接查对象数量:

curl http://localhost:8080/v1/objects?class=Article

能列出刚写入的记录,说明数据持久化和查询链路都通了。

新手最容易踩的三个坑

  • 只启动了 Weaviate,没启动向量化服务。 建 collection 不会报错,但导入数据时向量化会失败,日志里能看到连接 t2v-transformers 超时。
  • 把 localhost 写进容器环境变量。 容器内的 localhost 指容器自己,不是宿主机。跨容器通信要用服务名或宿主机局域网 IP。
  • 直接对外暴露 8080 且关闭鉴权。 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true 只适合本地调试,公网环境要配置 API key 或 OIDC,否则任何人都能读写数据。

数据目录建议定期备份,单节点模式下删掉 /var/lib/weaviate 就等于清空全部向量和对象。

常见疑问

问:一定要用 text2vec-transformers 吗? 不一定。
如果你自己生成向量,可以把 collection 的 vectorizer 设为 none,导入时在请求体里带上 vector 字段。

问:端口 8080 被占用了怎么办? 把 -p 8080:8080 改成 -p 8081:8080,后续请求地址也跟着换成 8081,容器内端口不用动。

问:怎么确认数据真的持久化了? 执行 docker restart weaviate 后再次查询 Article 集合,记录还在就说明挂载目录生效。

到这里,Weaviate 的最小可用链路已经跑通。
后续要接入真实业务,建议先用小批量数据验证向量化和检索效果,再考虑批量导入和性能调优。

分享到:
上一篇
Zep 使用教程:为 AI 助手接入长期记忆的配置方法
下一篇
Milvus 向量数据库怎么用:Docker 部署与检索验证
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意