go语言如何使用elastic官方客户端go-elasticsearch/v8实现数据批量更新
go语言的官方客户端
Elasticsearch 的官方 Go 客户端是由 Elastic 开发、维护和支持的客户端系列的最新成员之一。 初始版本于 2019 年初发布,并在过去几年中逐渐成熟,获得了重试请求、发现集群节点和各种辅助组件等功能。
以上来自”
现在最新版已经是v8了,就在不久前,我刚刚更新到新鲜出炉的v8@8.9.0。由于v8版本变动较大,网上不多的基于golang的例子都几乎不能用了,最好还是参考上边所提到的
Bulk功能必须使用es.Client
一开始我选择了使用es.TypedClient,虽然使用起来麻烦点儿,但毕竟是强类型的,使用还算是顺利的,直到我开始打算使用Bulk批量更新。到目前为止,我在必应上是搜索不到基于v8的Bulk使用例子,没办法只好在github官网的源代码库里找到_example目录下单范例,后来还找到
引用博文中的一段话:
One of the most common use cases for any Elasticsearch client is indexing documents into Elasticsearch as quickly and efficiently as possible. The most straightforward option, using the plain Elasticsearch Bulk API, comes with a lot of drawbacks: you have to manually prepare the meta and data pairs of the payload, divide the payload into batches, deserialize the response, inspect the results for errors, display a report, and so on. The default example in the repository demonstrates quite eloquently how involved it all is.
For that reason, the client provides a helper component, esutil.BulkIndexer, similar to bulk helpers in other clients:
基于同样的原因,我也选择了使用esutil.BulkIndexer,因为看上去的确方便了许多。但是当我开始着手编码,立马蒙圈了,TypedClient根本没有Bulk这个方法!......过程不提,最后,我还是没辙了,决定同时在连接一个普通的Client类型。
第一次暴击
照猫画虎很简单,很快实现了我的bulk版本方法:
func (me *YhkbElasticReceiver) bulkUpsertKnowledge(datas []*ElKnowledge)(){
var countSuccessful uint64
// Create the BulkIndexer
bulkIndexer, err := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{
Index: indexName, // The default index name
Client: me.client, // The Elasticsearch client
NumWorkers: 3, // The number of worker goroutines
FlushBytes: 102400, // The flush threshold in bytes
FlushInterval: 30 * time.Second, // The periodic flush interval
})
if err != nil {
log.Fatalf("Error creating the indexer: %s", err)
}
start := time.Now().UTC()
for _, data:=range datas{
sid:=data.SID()
payload:=data.ToJson()
doc:=esutil.BulkIndexerItem{
Action: "update",
Index: indexName,
DocumentID: sid,
Body: strings.NewReader(payload),
OnSuccess: func(ctx context.Context, item esutil.BulkIndexerItem, res esutil.BulkIndexerResponseItem) {
atomic.AddUint64(&countSuccessful, 1)
//log.Println("bulk item success")
},
OnFailure: func(ctx context.Context, item esutil.BulkIndexerItem, res esutil.BulkIndexerResponseItem, err error) {
if err != nil {
log.Printf("[YhkbElReceiver.BulkUpsertKnowledge] ERROR: %s \n", err)