本指南汇总在 xb 中实现 SQL + 向量混合查询时的经验,可与 QDRANT_GUIDE.md 搭配使用。
VectorSearch 之前做 L2 归一化,xb 不会自动处理。VectorSearch("embedding", vec, limit) 不会检查长度。VectorSearchMulti,或构建多个 builder 再 UNION ALL。built := xb.Of(&CodeVector{}).
Eq("language", "go").
VectorSearch("embedding", queryVector, 20).
Sort("score", xb.Desc).
Offset(0).
Build()
json, err := built.JsonOfSelect()
filter.must。Sort("score", xb.Desc),方便与 SQL 语句保持一致。SELECT id FROM articles ... LIMIT 200)。VectorSearchByIDs 进行二次排序。VectorSearch 获取 top-N ID。xb.Of("articles").In("id", ids...) 查询详情并联表。xb.Of(&FeedVector{}).
Meta(func(meta *interceptor.Metadata) {
meta.Set("tenant_id", tenantID)
}).
Eq("tenant_id", tenantID).
VectorSearch("embedding", vec, 40)
QdrantCustom 可配置 WithHashDiversity、WithMinDistance、WithPayloadSelector 等 helper。
custom := xb.NewQdrantBuilder().
WithHashDiversity(func(h *xb.HashDiversity) {
h.Field = "category"
h.Modulo = 4
})
built := xb.Of(&ProductVector{}).
Custom(custom).
VectorSearch("embedding", vec, 12).
Build()
| 症状 | 可能原因 | 解决办法 |
|---|---|---|
filter.must 为空 |
条件值被自动跳过 | 检查是否为零值/空字符串 |
Custom is nil |
未调用 Custom() |
添加 xb.NewQdrantBuilder().Build() |
| limit 不生效 | 只在 SQL Builder 里设置 | 在 VectorSearch 或 Recommend Builder 里设置 |
| 租户串线 | 忘记 Eq("tenant_id", ...) |
所有 builder 加租户守卫 |
QDRANT_GUIDE.md:API 细节CUSTOM_INTERFACE.md:自定义向量数据库适配FILTERING.md:理解自动跳过规则若你有值得分享的模式,欢迎提交 PR 补充本指南。