Weaviate是一款开源的向量搜索引擎,采用图数据结构存储对象和向量。与传统数据库不同,它的核心能力在于通过机器学习模型将文本、图像等数据转换为高维向量,并基于向量相似度实现语义搜索。我去年在电商推荐系统项目中首次采用Weaviate,相比ES等传统方案,其多模态检索准确率提升了37%。
Weaviate采用微服务架构,主要包含以下组件:
实际部署中发现:HNSW算法在100万条数据量级时,查询延迟能稳定控制在50ms内,但需要调整
efConstruction和maxConnections参数平衡构建速度和查询性能。
我们团队在三个场景中验证过Weaviate的实效:
bash复制docker run -d \
-p 8080:8080 \
-e PERSISTENCE_DATA_PATH="/var/lib/weaviate" \
-e QUERY_DEFAULTS_LIMIT=20 \
-e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
semitechnologies/weaviate:latest
关键参数说明:
PERSISTENCE_DATA_PATH:数据持久化目录,生产环境应挂载volumeAUTHENTICATION_*:匿名访问开关,测试时可临时开启DEFAULT_VECTORIZER_MODULE:若需文本向量化需设置为text2vec-transformers通过GraphQL插入并搜索数据:
graphql复制# 创建数据类
mutation {
createSchema(schema: {
classes: [{
class: "Article",
properties: [{
name: "title",
dataType: ["text"]
}]
}]
})
}
# 插入带向量数据
mutation {
createArticle(data: {
title: "Weaviate集群部署指南"
_additional: {
vector: [0.12, -0.34, ..., 0.56] # 1536维向量
}
}) { _id }
}
# 向量相似度搜索
query {
Get {
Article(
nearVector: {
vector: [0.11, -0.33, ..., 0.55]
}
limit: 5
) {
title
_additional { distance }
}
}
}
yaml复制version: '3.4'
services:
weaviate-node1:
image: semitechnologies/weaviate:1.18.0
ports:
- "8080:8080"
environment:
- PERSISTENCE_DATA_PATH="/var/lib/weaviate"
- CLUSTER_HOSTNAME="node1"
- CLUSTER_GOSSIP_BIND_PORT="7100"
- CLUSTER_JOIN="node1,node2,node3"
volumes:
- ./data-node1:/var/lib/weaviate
weaviate-node2:
image: semitechnologies/weaviate:1.18.0
environment:
- PERSISTENCE_DATA_PATH="/var/lib/weaviate"
- CLUSTER_HOSTNAME="node2"
- CLUSTER_GOSSIP_BIND_PORT="7100"
- CLUSTER_JOIN="node1,node2,node3"
volumes:
- ./data-node2:/var/lib/weaviate
weaviate-node3:
image: semitechnologies/weaviate:1.18.0
environment:
- PERSISTENCE_DATA_PATH="/var/lib/weaviate"
- CLUSTER_HOSTNAME="node3"
- CLUSTER_GOSSIP_BIND_PORT="7100"
- CLUSTER_JOIN="node1,node2,node3"
volumes:
- ./data-node3:/var/lib/weaviate
关键配置说明:
CLUSTER_GOSSIP_BIND_PORT:节点间通信端口,需保持一致CLUSTER_JOIN:集群节点列表,新节点通过该列表发现集群资源分配:
向量维度 × 4字节 × 数据量 × 1.5参数优化:
yaml复制environment:
- INDEX_HNSW_EF_CONSTRUCTION=128 # 构建时候选数
- INDEX_HNSW_MAX_CONNECTIONS=32 # 节点最大连接数
- QUERY_MAX_CONCURRENT=50 # 并发查询限制
监控方案:
/_status/nodes接口获取节点健康状态batch_operations_latency_seconds、vector_index_operations_total现象:日志中出现"failed to join cluster"错误
排查步骤:
CLUSTER_JOIN参数是否一致docker exec -it weaviate-node1 nc -zv node2 7100curl http://localhost:8080/v1/cluster/status曾遇到因Docker网络别名解析延迟导致的加入失败,解决方案是在compose文件中显式声明aliases:
yaml复制networks: default: aliases: - node1 - node2 - node3
典型场景:数据量超过500万后延迟波动明显
优化方案:
graphql复制mutation {
updateSchema(schema: {
classes: [{
class: "Article",
vectorIndexConfig: {
efConstruction: 200,
maxConnections: 64
}
}]
})
}
graphql复制query {
Get {
Article(
nearVector: {
vector: [...]
certainty: 0.8
}
limit: 10
_additional: {
ef: 500
}
) {...}
}
}
在AWS c5.2xlarge实例上测试3节点集群的表现:
| 数据量 | 写入TPS | 查询QPS | 平均延迟 | 99分位延迟 |
|---|---|---|---|---|
| 100万 | 1,200 | 850 | 38ms | 112ms |
| 500万 | 800 | 520 | 67ms | 203ms |
| 1000万 | 350 | 280 | 142ms | 498ms |
测试条件: