项目 | 说明 |
---|---|
Go 版本 | 1.21 及以上(推荐使用近期版本 1.23+) |
安装命令 | bash\ngo get github.com/elastic/go-elasticsearch/v9@latest\n |
版本对齐 | 客户端主版本需与集群主版本一致(例如 v9 对 ES 9.x) |
es, err := elasticsearch.NewDefaultClient()
if err != nil {
log.Fatalf("init ES: %s", err)
}
log.Println(es.Info())
typedClient, err := elasticsearch.NewTypedClient(elasticsearch.Config{
CloudID: "" ,
APIKey: "" ,
})
if err != nil {
log.Fatal(err)
}
es, _ := elasticsearch.NewClient(elasticsearch.Config{
Addresses: []string{
"https://node-a:9200",
"https://node-b:9200",
},
// Transport: &http.Transport{ ... } // 可自定义链路追踪、代理等
})
typedClient.Indices.Create("my_index").Do(context.TODO())
doc := struct {
Name string `json:"name"`
}{"go-elasticsearch"}
// Typed API
typedClient.Index("my_index").
Id("1").
Request(doc).
Do(context.TODO())
// 低级 API
body := `{"name":"go-elasticsearch"}`
es.Index(
es.Index.WithIndex("my_index"),
es.Index.WithDocumentID("1"),
es.Index.WithBody(strings.NewReader(body)),
)
// 低级 API:Match All
query := `{"query":{"match_all":{}}}`
es.Search(
es.Search.WithIndex("my_index"),
es.Search.WithBody(strings.NewReader(query)),
)
// Typed API + esdsl
res, _ := typedClient.
Search("my_index").
Query(esdsl.NewMatchAllQuery()).
Do(context.TODO())
// 更新
es.Update("my_index", "1",
es.Update.WithBody(strings.NewReader(`{"doc":{"lang":"Go"}}`)),
)
// 删除文档与索引
es.Delete("my_index", "1")
es.Indices.Delete([]string{"my_index"})
esdsl
NewTypedClient
提供链式、强类型方法。query := esdsl.NewRangeQuery("age").Gte(30)
sort := esdsl.NewSort("age").Order(esdsl.SortOrderDesc)
res, _ := typedClient.
Search("users").
Query(query).
Sort(sort).
From(0).Size(10).
Do(context.TODO())
bi, _ := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{
Client: es,
NumWorkers: runtime.NumCPU(),
FlushBytes: 5 << 20, // 5 MB
FlushInterval: 30 * time.Second,
})
/* 向 bi.Add(...) 不断追加文档 */
bi.Close() // 发送剩余批次并统计结果
BulkIndexer 负责批大小、并发与失败重试,可轻松达到百万级文档每分钟的写入吞吐。
连接池
http.Transport
,一般无需另建池。MaxIdleConnsPerHost
。自动重试
超时控制
Transport.ResponseHeaderTimeout
、Transport.IdleConnTimeout
。context.WithTimeout
防止阻塞。问题 | 解答 |
---|---|
客户端与集群版本不一致能连吗? | v9 客户端可连接 ≥ 9.x 集群,但可能缺少新 API;建议主版本一致。 |
Typed API 会影响性能吗? | Typed API 仅影响构造请求,底层仍走相同 HTTP,性能损耗可忽略不计。 |
能否同时使用 v8 与 v9? | 可以,在 go.mod 中分别引用 /v8 与 /v9 ,并在代码中使用包别名区分。 |
凭借 Typed API 与 esdsl
的加持,Go 开发者无需手写 JSON,即可安全、优雅地调用完整 Elasticsearch 能力。你可以: