最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

go-elasticsearch: Elastic 官方的 Go 语言客户端

  • 2019-02-12
  • 本文字数:3403 字

    阅读完需:约 11 分钟

 go-elasticsearch: Elastic官方的Go语言客户端

说明

Elastic 官方鼓励在项目中尝试用这个包,但请记住以下几点:


  • 这个项目的工作还在进行中,并非所有计划的功能和 Elasticsearch 官方客户端中的标准(故障重试,节点自动发现等)都实现了。

  • API 稳定性无法保证。 尽管公共 API 的设计非常谨慎,但它们可以根据进一步的探索和用户反馈以不兼容的方式进行更改。

  • 客户端的目标是 Elasticsearch 7.x 版本。后续将添加对 6.x 和 5.x 版本 API 的支持。

安装

go get安装这个包:


go get -u github.com/elastic/go-elasticsearch
复制代码


或者将这个包添加到go.mod文件:


require github.com/elastic/go-elasticsearch v0.0.0
复制代码


或者克隆这个仓库:


git clone https://github.com/elastic/go-elasticsearch.git && cd go-elasticsearch
复制代码


一个完整的示例:


mkdir my-elasticsearch-app && cd my-elasticsearch-app
cat > go.mod <<-END module my-elasticsearch-app
require github.com/elastic/go-elasticsearch v0.0.0END
cat > main.go <<-END package main
import ( "log"
"github.com/elastic/go-elasticsearch" )
func main() { es, _ := elasticsearch.NewDefaultClient() log.Println(es.Info()) }END
go run main.go
复制代码

用法

elasticsearch包与另外两个包绑定在一起,esapi用于调用 Elasticsearch 的 API,estransport通过 HTTP 传输数据。


使用elasticsearch.NewDefaultClient()函数创建带有以下默认设置的客户端:


es, err := elasticsearch.NewDefaultClient()if err != nil {  log.Fatalf("Error creating the client: %s", err)}
res, err := es.Info()if err != nil { log.Fatalf("Error getting response: %s", err)}
log.Println(res)
// [200 OK] {// "name" : "node-1",// "cluster_name" : "go-elasticsearch"// ...
复制代码


注意:当导出ELASTICSEARCH_URL环境变量时,它将被用作集群端点。


使用elasticsearch.NewClient()函数(仅用作演示)配置该客户端:


cfg := elasticsearch.Config{  Addresses: []string{    "http://localhost:9200",    "http://localhost:9201",  },  Transport: &http.Transport{    MaxIdleConnsPerHost:   10,    ResponseHeaderTimeout: time.Second,    DialContext:           (&net.Dialer{Timeout: time.Second}).DialContext,    TLSClientConfig: &tls.Config{      MaxVersion:         tls.VersionTLS11,      InsecureSkipVerify: true,    },  },}
es, err := elasticsearch.NewClient(cfg)// ...
复制代码


下面的示例展示了更复杂的用法。它从集群中获取 Elasticsearch 版本,同时索引几个文档,并使用响应主体周围的一个轻量包装器打印搜索结果。


// $ go run _examples/main.go
package main
import ( "context" "encoding/json" "log" "strconv" "strings" "sync"
"github.com/elastic/go-elasticsearch" "github.com/elastic/go-elasticsearch/esapi")
func main() { log.SetFlags(0)
var ( r map[string]interface{} wg sync.WaitGroup )
// Initialize a client with the default settings. // // An `ELASTICSEARCH_URL` environment variable will be used when exported. // es, err := elasticsearch.NewDefaultClient() if err != nil { log.Fatalf("Error creating the client: %s", err) }
// 1. Get cluster info // res, err := es.Info() if err != nil { log.Fatalf("Error getting response: %s", err) } // Deserialize the response into a map. if err := json.NewDecoder(res.Body).Decode(&r); err != nil { log.Fatalf("Error parsing the response body: %s", err) } // Print version number. log.Printf("~~~~~~~> Elasticsearch %s", r["version"].(map[string]interface{})["number"])
// 2. Index documents concurrently // for i, title := range []string{"Test One", "Test Two"} { wg.Add(1)
go func(i int, title string) { defer wg.Done()
// Set up the request object directly. req := esapi.IndexRequest{ Index: "test", DocumentID: strconv.Itoa(i + 1), Body: strings.NewReader(`{"title" : "` + title + `"}`), Refresh: "true", }
// Perform the request with the client. res, err := req.Do(context.Background(), es) if err != nil { log.Fatalf("Error getting response: %s", err) } defer res.Body.Close()
if res.IsError() { log.Printf("[%s] Error indexing document ID=%d", res.Status(), i+1) } else { // Deserialize the response into a map. var r map[string]interface{} if err := json.NewDecoder(res.Body).Decode(&r); err != nil { log.Printf("Error parsing the response body: %s", err) } else { // Print the response status and indexed document version. log.Printf("[%s] %s; version=%d", res.Status(), r["result"], int(r["_version"].(float64))) } } }(i, title) } wg.Wait()
log.Println(strings.Repeat("-", 37))
// 3. Search for the indexed documents // // Use the helper methods of the client. res, err = es.Search( es.Search.WithContext(context.Background()), es.Search.WithIndex("test"), es.Search.WithBody(strings.NewReader(`{"query" : { "match" : { "title" : "test" } }}`)), es.Search.WithTrackTotalHits(true), es.Search.WithPretty(), ) if err != nil { log.Fatalf("ERROR: %s", err) } defer res.Body.Close()
if res.IsError() { var e map[string]interface{} if err := json.NewDecoder(res.Body).Decode(&e); err != nil { log.Fatalf("error parsing the response body: %s", err) } else { // Print the response status and error information. log.Fatalf("[%s] %s: %s", res.Status(), e["error"].(map[string]interface{})["type"], e["error"].(map[string]interface{})["reason"], ) } }
if err := json.NewDecoder(res.Body).Decode(&r); err != nil { log.Fatalf("Error parsing the response body: %s", err) } // Print the response status, number of results, and request duration. log.Printf( "[%s] %d hits; took: %dms", res.Status(), int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64)), int(r["took"].(float64)), ) // Print the ID and document source for each hit. for _, hit := range r["hits"].(map[string]interface{})["hits"].([]interface{}) { log.Printf(" * ID=%s, %s", hit.(map[string]interface{})["_id"], hit.(map[string]interface{})["_source"]) }
log.Println(strings.Repeat("=", 37))}
// ~~~~~~~> Elasticsearch 7.0.0-SNAPSHOT// [200 OK] updated; version=1// [200 OK] updated; version=1// -------------------------------------// [200 OK] 2 hits; took: 7ms// * ID=1, map[title:Test One]// * ID=2, map[title:Test Two]// =====================================
复制代码


如上述示例所示,esapi包允许通过两种不同的方式调用 Elasticsearch API:通过创建结构(如IndexRequest),并向其传递上下文和客户端来调用其Do()方法,或者通过客户端上可用的函数(如WithIndex())直接调用其上的Search()函数。更多信息请参阅包文档。


estransport包处理与 Elasticsearch 之间的数据传输。 目前,这个实现只占据很小的空间:它只在已配置的集群端点上进行循环。后续将添加更多功能:重试失败的请求,忽略某些状态代码,自动发现群集中的节点等等。

Examples

_examples文件夹包含许多全面的示例,可帮助你上手使用客户端,包括客户端的配置和自定义,模拟单元测试的传输,将客户端嵌入自定义类型,构建查询,执行请求和解析回应。

许可证

遵循 Apache License 2.0 版本。


参考链接:


https://github.com/elastic/go-elasticsearch#go-elasticsearch


2019-02-12 08:0016145
用户头像
张婵 InfoQ 技术编辑

发布了 87 篇内容, 共 51.5 次阅读, 收获喜欢 218 次。

关注

评论 1 条评论

发布
用户头像
感谢怕大家看不懂将README翻译了一次系列 o(╯□╰)o
2019-08-01 10:36
回复
没有更多了
发现更多内容

AI for Science系列(三):赛桨PaddleScience底层核心框架技术创新详解

飞桨PaddlePaddle

人工智能 paddle 飞桨 框架技术

学术贴 | FPGA 加速图数据库查询执行

KaiwuDB

数据库

MySql基础-笔记10-索引

MySQL 数据库

风险洞察之事件总线的探索与演进

京东科技开发者

京东云 事件总线 京东技术 数据管道 风险洞察

10分钟学会使用 Loki 日志聚合系统

北京好雨科技有限公司

Kubernetes 云原生 rainbond 企业号 2 月 PK 榜

MySql基础-笔记11-临时表、复制表、元数据、序列使用

MySQL 数据库

程序员的终点不一定是技术!

这我可不懂

低代码 项目经理 低代码平台

Gluten 首次开源技术沙龙成功举办,更多新能力值得期待

Kyligence

开源技术 Gluten

活动回顾丨研发效能度量线下沙龙圆满举办

Kyligence

数据分析 Kyligence Zen

单元测试利器——手把手教你使用Mockito

京东科技开发者

单元测试 Mockito 京东云 安全测试 京东技术

乌卡时代的云成本管理:从0到1了解FinOps

SEAL安全

云服务 FinOps 企业号 2 月 PK 榜

飞桨全量支持业内AI科学计算工具——DeepXDE!

飞桨PaddlePaddle

人工智能 深度学习 开源

活动预告 | GAIDC 全球人工智能开发者先锋大会

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

微服务拆分治理最佳实践

京东科技开发者

数据库 微服务 京东云 京东技术 安全接口

搜索EE场景排序链路升级

京东科技开发者

模型 搜索 EE 企业号 2 月 PK 榜 Explore & Exploit

本周 2 场直播预告!Intel 高级工程师带你探索开源机密计算社区 CCZoo | 第 65 期

OpenAnolis小助手

云计算 运维 直播 intel 龙蜥大讲堂

项目终于用上了低代码,才知道为什么真香了!

引迈信息

项目管理 低代码

使用 NGINX 在 Kubernetes 中对 TCP 和 UDP 流量进行负载均衡

NGINX开源社区

nginx Kuber udp tpc 企业号 2 月 PK 榜

AI for Science系列(一) :飞桨加速CFD(计算流体力学)原理与实践

飞桨PaddlePaddle

paddle 算法 飞桨 框架技术

软件测试 | 霍格沃兹线下班开课啦!

测吧(北京)科技有限公司

测试

MySQL审计插件-MariaDB Audit Plugin

GreatSQL

:MySQL 数据库 maria greatsql greatsql社区

软件测试/测试开发 | App测试时常用的adb命令你都掌握了哪些呢?

测试人

android 软件测试 自动化测试 测试开发 adb

WorkPlus“Meet”,让企业高效协作的视频会议系统

WorkPlus

你什么档次?敢和我用一样的即时通讯平台WorkPlus?

WorkPlus

中科协发布2022“科创中国”开源创新榜 OceanBase开源社区入选

OceanBase 数据库

数据库 oceanbase

直播预告 | 企业如何轻松完成数据治理?火山引擎DataLeap给你一份实战攻略!

字节跳动数据平台

数据库 大数据 数据治理 数据实践

AI for Science系列(二):基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!

飞桨PaddlePaddle

深度学习 paddle API 飞桨

案例介绍:使用A-Ops性能热点火焰图进行性能诊断

openEuler

Linux 操作系统 openEuler 性能测评 A-Ops

MASA MAUI Plugin (八)Android相册多选照片(Intent 方式)

MASA技术团队

.net blazor MAUI MASA Blazor

推荐系统[二]:召回算法超详细讲解[召回模型演化过程、召回模型主流常见算法(DeepMF_TDM_Airbnb Embedding_Item2vec等)、召回路径简介、多路召回融合]

汀丶人工智能

自然语言处理 深度学习 推荐系统 搜索算法 召回算法

GhatGPT在信息安全方面的应用

HummerCloud

ChatGPT

 go-elasticsearch: Elastic官方的Go语言客户端_语言 & 开发_张婵_InfoQ精选文章