Weaviate Go SDK 初始化必须传入配置好的 *http.Client,命名需首字母大写且无特殊字符,property 类型须用"text"等预定义值,未配vectorize时需手动提供[]float64向量,nearText搜索依赖字段被正确vectorized。

weaviate.Client 初始化时必须显式传入 HTTP 客户端
直接 new weaviate.Client(<url>) 会 panic,因为 Weaviate Go SDK(v1.24+)要求你提供一个配置好的 *http.Client,而不是自动创建。它不接受裸 URL 字符串。
常见错误现象:panic: runtime error: invalid memory address or nil pointer dereference,通常发生在调用 client.Schema().Getter().Do(ctx) 之前就崩了。
- 正确做法:用
weaviate.Config{Scheme: "https", Host: "localhost:8080"}+ 自定义*http.Client - 若需 bearer token(如 Weaviate Cloud 或启用了 auth 的实例),必须在
http.Client.Transport中注入Authorization头,SDK 不接管鉴权逻辑 - 超时必须由你控制:建议设置
Timeout: 30 * time.Second,否则默认无超时,网络卡住会 hang 住整个 goroutine
Schema 创建失败常因 class 名称或 property 类型不合法
Weaviate 对 class 和 property 命名有严格限制:首字母必须大写、不能含下划线/空格/特殊字符;property 类型必须是预定义枚举值(如 "text"、"number"、"boolean"),不是 Go 类型名。
典型错误信息:{"error":[{"message":"invalid object class name"}]} 或 "property type 'string' is not supported"。
立即学习“go语言免费学习笔记(深入)”;
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
-
"string"是错的,必须用"text"(对应字符串)或"string[]"(对应字符串切片) - class 名如
"Article"合法,"article"或"my_article"都会拒收 - vectorizer 配置要和实际模块匹配:启用
text2vec-openai但没配 API key,会导致class创建成功但后续objects.Create()报 500
对象写入时 vector 字段不能靠 SDK 自动生成(除非启用 vectorizer)
如果你没在 class schema 中配置 vectorizer,或者禁用了自动向量化("vectorizePropertyName": false),那么 objects.Create() 必须手动提供 vector 字段——SDK 不会调用外部模型或做 embedding 计算。
错误表现:插入成功但查不到(nearText 搜索返回空),或报错 "vector is required for object creation"。
- 手动传 vector:把
[]float32转成[]float64再塞进vector字段(Weaviate 接口只认[]float64) - 用第三方库(如
golang-ml/goml或调 OpenAI Embeddings API)先生成向量,再写入 - 别依赖
client.Objects().CreateWithoutVec()—— 这个方法仅跳过校验,不补向量,仍会失败
nearText 搜索返回空结果多数时候是 text 属性未被 vectorized
nearText 不是关键词匹配,它把 query 文本转成向量后做余弦相似度检索。如果目标 class 的 text property 没被 vectorizer 纳入(比如 schema 中漏了 "moduleConfig": {"text2vec-openai": {"skip": false}}),那该字段根本没参与向量化,搜不到是必然的。
- 检查方式:用
client.Schema().Getter().Do(ctx)查 class 的moduleConfig是否生效 - 确保
properties列表里对应字段的name和你写入时用的 key 一致(大小写敏感) - 调试技巧:先用
client.Objects().GetById()取一个已有对象,看返回 JSON 里有没有"vector"字段;没有,说明写入时就没向量化成功
Weaviate 的 Go SDK 行为非常“直给”:不封装底层细节,不自动 fallback,也不隐藏配置歧义。最容易卡住的地方,往往不是代码逻辑,而是 schema 定义与服务端模块状态之间的隐式耦合——比如改了 Docker Compose 里的 modules 但忘了重建 schema,或者开了 vectorizer 却没配 API key 导致静默降级。

















