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 \u0026amp;\u0026amp; cd go-elasticsearch
一个完整的示例:
mkdir my-elasticsearch-app \u0026amp;\u0026amp; cd my-elasticsearch-appcat \u0026gt; go.mod \u0026lt;\u0026lt;-END module my-elasticsearch-app require github.com/elastic/go-elasticsearch v0.0.0ENDcat \u0026gt; main.go \u0026lt;\u0026lt;-END package main import ( \u0026quot;log\u0026quot; \u0026quot;github.com/elastic/go-elasticsearch\u0026quot; ) func main() { es, _ := elasticsearch.NewDefaultClient() log.Println(es.Info()) }ENDgo run main.go
用法
elasticsearch
包与另外两个包绑定在一起,esapi
用于调用Elasticsearch的API,estransport
通过HTTP传输数据。
使用elasticsearch.NewDefaultClient()
函数创建带有以下默认设置的客户端:
es, err := elasticsearch.NewDefaultClient()if err != nil { log.Fatalf(\u0026quot;Error creating the client: %s\u0026quot;, err)}res, err := es.Info()if err != nil { log.Fatalf(\u0026quot;Error getting response: %s\u0026quot;, err)}log.Println(res)// [200 OK] {// \u0026quot;name\u0026quot; : \u0026quot;node-1\u0026quot;,// \u0026quot;cluster_name\u0026quot; : \u0026quot;go-elasticsearch\u0026quot;// ...
注意:当导出ELASTICSEARCH_URL
环境变量时,它将被用作集群端点。
使用elasticsearch.NewClient()
函数(仅用作演示)配置该客户端:
cfg := elasticsearch.Config{ Addresses: []string{ \u0026quot;http://localhost:9200\u0026quot;, \u0026quot;http://localhost:9201\u0026quot;, }, Transport: \u0026amp;http.Transport{ MaxIdleConnsPerHost: 10, ResponseHeaderTimeout: time.Second, DialContext: (\u0026amp;net.Dialer{Timeout: time.Second}).DialContext, TLSClientConfig: \u0026amp;tls.Config{ MaxVersion: tls.VersionTLS11, InsecureSkipVerify: true, }, },}es, err := elasticsearch.NewClient(cfg)// ...
下面的示例展示了更复杂的用法。它从集群中获取Elasticsearch版本,同时索引几个文档,并使用响应主体周围的一个轻量包装器打印搜索结果。
// $ go run _examples/main.gopackage mainimport ( \u0026quot;context\u0026quot; \u0026quot;encoding/json\u0026quot; \u0026quot;log\u0026quot; \u0026quot;strconv\u0026quot; \u0026quot;strings\u0026quot; \u0026quot;sync\u0026quot; \u0026quot;github.com/elastic/go-elasticsearch\u0026quot; \u0026quot;github.com/elastic/go-elasticsearch/esapi\u0026quot;)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(\u0026quot;Error creating the client: %s\u0026quot;, err) } // 1. Get cluster info // res, err := es.Info() if err != nil { log.Fatalf(\u0026quot;Error getting response: %s\u0026quot;, err) } // Deserialize the response into a map. if err := json.NewDecoder(res.Body).Decode(\u0026amp;r); err != nil { log.Fatalf(\u0026quot;Error parsing the response body: %s\u0026quot;, err) } // Print version number. log.Printf(\u0026quot;~~~~~~~\u0026gt; Elasticsearch %s\u0026quot;, r[\u0026quot;version\u0026quot;].(map[string]interface{})[\u0026quot;number\u0026quot;]) // 2. Index documents concurrently // for i, title := range []string{\u0026quot;Test One\u0026quot;, \u0026quot;Test Two\u0026quot;} { wg.Add(1) go func(i int, title string) { defer wg.Done() // Set up the request object directly. req := esapi.IndexRequest{ Index: \u0026quot;test\u0026quot;, DocumentID: strconv.Itoa(i + 1), Body: strings.NewReader(`{\u0026quot;title\u0026quot; : \u0026quot;` + title + `\u0026quot;}`), Refresh: \u0026quot;true\u0026quot;, } // Perform the request with the client. res, err := req.Do(context.Background(), es) if err != nil { log.Fatalf(\u0026quot;Error getting response: %s\u0026quot;, err) } defer res.Body.Close() if res.IsError() { log.Printf(\u0026quot;[%s] Error indexing document ID=%d\u0026quot;, res.Status(), i+1) } else { // Deserialize the response into a map. var r map[string]interface{} if err := json.NewDecoder(res.Body).Decode(\u0026amp;r); err != nil { log.Printf(\u0026quot;Error parsing the response body: %s\u0026quot;, err) } else { // Print the response status and indexed document version. log.Printf(\u0026quot;[%s] %s; version=%d\u0026quot;, res.Status(), r[\u0026quot;result\u0026quot;], int(r[\u0026quot;_version\u0026quot;].(float64))) } } }(i, title) } wg.Wait() log.Println(strings.Repeat(\u0026quot;-\u0026quot;, 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(\u0026quot;test\u0026quot;), es.Search.WithBody(strings.NewReader(`{\u0026quot;query\u0026quot; : { \u0026quot;match\u0026quot; : { \u0026quot;title\u0026quot; : \u0026quot;test\u0026quot; } }}`)), es.Search.WithTrackTotalHits(true), es.Search.WithPretty(), ) if err != nil { log.Fatalf(\u0026quot;ERROR: %s\u0026quot;, err) } defer res.Body.Close() if res.IsError() { var e map[string]interface{} if err := json.NewDecoder(res.Body).Decode(\u0026amp;e); err != nil { log.Fatalf(\u0026quot;error parsing the response body: %s\u0026quot;, err) } else { // Print the response status and error information. log.Fatalf(\u0026quot;[%s] %s: %s\u0026quot;, res.Status(), e[\u0026quot;error\u0026quot;].(map[string]interface{})[\u0026quot;type\u0026quot;], e[\u0026quot;error\u0026quot;].(map[string]interface{})[\u0026quot;reason\u0026quot;], ) } } if err := json.NewDecoder(res.Body).Decode(\u0026amp;r); err != nil { log.Fatalf(\u0026quot;Error parsing the response body: %s\u0026quot;, err) } // Print the response status, number of results, and request duration. log.Printf( \u0026quot;[%s] %d hits; took: %dms\u0026quot;, res.Status(), int(r[\u0026quot;hits\u0026quot;].(map[string]interface{})[\u0026quot;total\u0026quot;].(map[string]interface{})[\u0026quot;value\u0026quot;].(float64)), int(r[\u0026quot;took\u0026quot;].(float64)), ) // Print the ID and document source for each hit. for _, hit := range r[\u0026quot;hits\u0026quot;].(map[string]interface{})[\u0026quot;hits\u0026quot;].([]interface{}) { log.Printf(\u0026quot; * ID=%s, %s\u0026quot;, hit.(map[string]interface{})[\u0026quot;_id\u0026quot;], hit.(map[string]interface{})[\u0026quot;_source\u0026quot;]) } log.Println(strings.Repeat(\u0026quot;=\u0026quot;, 37))}// ~~~~~~~\u0026gt; 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
go-elasticsearch: Elastic官方的Go语言客户端相关推荐
- ElasticSearch集群安装及Java客户端使用
ElasticSearch集群安装及Java客户端使用 1.传统模式安装 1.1 ElasticSearch安装 下载Es安装包 ElasticSearch的官方地址:https://www.elas ...
- Rserve的R语言客户端RSclient
RSclient是实现Rserve通信的R语言客户端程序,对于统计人员使用RSclient调用Rserve运行R语言脚本,感觉会很奇怪.但对于实际应用架构来说却是很有帮助的,不仅可以统一Rserve的 ...
- Python 或将成为法国高中的官方编程教学语言
百度智能云 云生态狂欢季 热门云产品1折起>>> Python 或将成为法国高中的官方编程教学语言,这将带来几十万甚至几百万的新用户.此消息来自 Nina ,她是微软云开发的倡导 ...
- CAT 3.0 开源发布,支持多语言客户端及多项性能提升
项目背景 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大规模在线访问 ...
- 一文盘点PaddlePaddle官方九大自然语言处理模型
一文盘点PaddlePaddle官方九大自然语言处理模型:百度paddlepaddle模型
- Logstash+elasticsearch+elastic+nignx
注:本系统使用的是Logstash+elasticsearch+elastic+nignx 进行日志分析.展示 1环境版本:... 2 1.1主机:... 2 1.2前提:... 2 2 Logsta ...
- 【Elasticsearch】官方Elasticsearch Java客户端的状态
1.概述 翻译:State of the official Elasticsearch Java clients Java程序员在与Elasticsearch通信时有两种选择:他们可以使用HTTP上的 ...
- Elastic实战:canal自定义客户端,实现mysql多表同步到es
0. 引言 我们之前讲解了利用canal实现无代码入侵的同步mysql数据到elasticsearch,并且讲解了主子表数据如何同步. 通过canal1.1.5实现mysql8.0数据增量/全量同步到 ...
- Linux gsoap生成onvif框架(C语言客户端代码)一
创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...
最新文章
- 项目ITP(五) spring4.0 整合 Quartz 实现任务调度
- 中国电子学会青少年编程能力等级测试图形化一级编程题:小鸡与鸭妈拥抱
- python程序员又叫什么-Python程序员都知道的入门知识の四
- spring中Converter如何注入的
- ROS学习(十一):ROS URDF-model
- MySQL 5.1完全卸载
- Kanboard简单的可视化任务板,项目管理
- 在用dw.GetSqlSelect()获得到的Sql语句出现PBSELECT( VERSION的解决办法
- 每日英语:Five Really Dumb Money Moves You've Got to Avoid
- cent os重置mysql,linux mysql 能登陆不能修改用户(cent os 6.2)解决思路
- 【Pyhton】随机漫步散点图
- mybatis There is no getter for property named 'xx' in 'class java.lang.String
- CSDN中巧用< >符号显示
- iOS 仿淘宝实现商品规格图片的放大缩小功能
- Native方式运行Fabric(非Docker方式)
- Python基础——numpy.ndarray一维数组与多维数组
- mysql 截取 效率,MySQL 随机函数获取数据速度和效率分析
- 360系统修复过程中卡慢问题的解决方案
- 用于实时视频和图像去雾的优化对比度增强算法
- Html调用手机打电话功能
热门文章
- 修改oracle的表空间文件scn,分享:bbed修改数据文件头推进scn与其他数据文件相同...
- mysql binlog php处理_MySQL数据的binlog处理方法
- 引用管理器没有程序集_程序员必背英语单词不会,就别说你是程序员!
- python django下载_简单了解django文件下载方式
- android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...
- 微信公众号盈利模式_微信公众号的盈利模式有哪些?四种模式分享
- python语言程序设计 梁勇_计算机二级教程 Python语言程序设计,第9章Python标准库概览...
- python生成shell脚本_Python设置在shell脚本中自动补全功能的方法
- 华为主题包hwt下载_华为主题太丑?修改方式它来了
- Python学习笔记:闭包与作用域