Custom 接口是 xb 扩展能力的核心。框架不再内置大量方言,而是让用户在几分钟内实现任意数据库(SQL 或向量)的序列化逻辑。
type Custom interface {
Generate(built *xb.Built) (any, error)
}
built 包含 Builder 产出的 AST(select、from、conditions 等)。built.JsonOfSelect() 或 built.CustomGenerate()。type MyVectorCustom struct{}
func (c *MyVectorCustom) Generate(built *xb.Built) (any, error) {
payload := map[string]any{
"collection": built.Table,
"filter": built.FilterJSON(),
"vector": built.Vector,
}
return payload, nil
}
json, err := xb.Of("vectors").
Custom(&MyVectorCustom{}).
VectorSearch("embedding", vec, 10).
Build().
JsonOfSelect()
| 目标 | 说明 |
|---|---|
| 极简接口 | 一个接口、一个方法 |
| 隔离性 | 用户可独立迭代,无需 fork xb |
| 性能 | 接口调用约 1ns,无额外分支 |
| 面向未来 | 新特性出现时,用户可立即实现 |
type MilvusCustom struct {
Endpoint string
Timeout time.Duration
}
func NewMilvusBuilder() *MilvusBuilder {
return &MilvusBuilder{
custom: &MilvusCustom{
Endpoint: "http://localhost:19530",
Timeout: 3 * time.Second,
},
}
}
func (c *MilvusCustom) Generate(built *xb.Built) (any, error) {
req := buildMilvusPayload(built)
return req, nil
}
func TestMilvusCustom_Generate(t *testing.T) {
built := xb.Of("code_vectors").
VectorSearch("embedding", xb.Vector{0.1, 0.2}, 5).
Build()
custom := NewMilvusBuilder().Build()
payload, err := custom.Generate(built)
require.NoError(t, err)
snapshot.AssertJSON(t, payload)
}
| 场景 | 示例 |
|---|---|
| 向量数据库 JSON | Qdrant(官方)、Milvus、Pinecone |
| SQL 方言扩展 | Oracle upsert、ClickHouse FORMAT |
| 内部 API | 公司自研搜索服务 |
| 混合模式 | 同一 builder 输出 SQL + JSON |
QDRANT_GUIDE.md:官方实现VECTOR_GUIDE.md:嵌入实践FILTERING.md:理解自动过滤若你发布了可复用的 Custom 适配,欢迎在 doc/en/ 或 doc/cn/ 中追加说明并提交 PR。