说明

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语言客户端相关推荐

  1. ElasticSearch集群安装及Java客户端使用

    ElasticSearch集群安装及Java客户端使用 1.传统模式安装 1.1 ElasticSearch安装 下载Es安装包 ElasticSearch的官方地址:https://www.elas ...

  2. Rserve的R语言客户端RSclient

    RSclient是实现Rserve通信的R语言客户端程序,对于统计人员使用RSclient调用Rserve运行R语言脚本,感觉会很奇怪.但对于实际应用架构来说却是很有帮助的,不仅可以统一Rserve的 ...

  3. Python 或将成为法国高中的官方编程教学语言

    百度智能云 云生态狂欢季 热门云产品1折起>>>   Python 或将成为法国高中的官方编程教学语言,这将带来几十万甚至几百万的新用户.此消息来自 Nina ,她是微软云开发的倡导 ...

  4. CAT 3.0 开源发布,支持多语言客户端及多项性能提升

    项目背景 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大规模在线访问 ...

  5. 一文盘点PaddlePaddle官方九大自然语言处理模型

    一文盘点PaddlePaddle官方九大自然语言处理模型:百度paddlepaddle模型

  6. Logstash+elasticsearch+elastic+nignx

    注:本系统使用的是Logstash+elasticsearch+elastic+nignx 进行日志分析.展示 1环境版本:... 2 1.1主机:... 2 1.2前提:... 2 2 Logsta ...

  7. 【Elasticsearch】官方Elasticsearch Java客户端的状态

    1.概述 翻译:State of the official Elasticsearch Java clients Java程序员在与Elasticsearch通信时有两种选择:他们可以使用HTTP上的 ...

  8. Elastic实战:canal自定义客户端,实现mysql多表同步到es

    0. 引言 我们之前讲解了利用canal实现无代码入侵的同步mysql数据到elasticsearch,并且讲解了主子表数据如何同步. 通过canal1.1.5实现mysql8.0数据增量/全量同步到 ...

  9. Linux gsoap生成onvif框架(C语言客户端代码)一

    创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

最新文章

  1. 项目ITP(五) spring4.0 整合 Quartz 实现任务调度
  2. 中国电子学会青少年编程能力等级测试图形化一级编程题:小鸡与鸭妈拥抱
  3. python程序员又叫什么-Python程序员都知道的入门知识の四
  4. spring中Converter如何注入的
  5. ROS学习(十一):ROS URDF-model
  6. MySQL 5.1完全卸载
  7. Kanboard简单的可视化任务板,项目管理
  8. 在用dw.GetSqlSelect()获得到的Sql语句出现PBSELECT( VERSION的解决办法
  9. 每日英语:Five Really Dumb Money Moves You've Got to Avoid
  10. cent os重置mysql,linux mysql 能登陆不能修改用户(cent os 6.2)解决思路
  11. 【Pyhton】随机漫步散点图
  12. mybatis There is no getter for property named 'xx' in 'class java.lang.String
  13. CSDN中巧用< >符号显示
  14. iOS 仿淘宝实现商品规格图片的放大缩小功能
  15. Native方式运行Fabric(非Docker方式)
  16. Python基础——numpy.ndarray一维数组与多维数组
  17. mysql 截取 效率,MySQL 随机函数获取数据速度和效率分析
  18. 360系统修复过程中卡慢问题的解决方案
  19. 用于实时视频和图像去雾的优化对比度增强算法
  20. Html调用手机打电话功能

热门文章

  1. 修改oracle的表空间文件scn,分享:bbed修改数据文件头推进scn与其他数据文件相同...
  2. mysql binlog php处理_MySQL数据的binlog处理方法
  3. 引用管理器没有程序集_程序员必背英语单词不会,就别说你是程序员!
  4. python django下载_简单了解django文件下载方式
  5. android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...
  6. 微信公众号盈利模式_微信公众号的盈利模式有哪些?四种模式分享
  7. python语言程序设计 梁勇_计算机二级教程 Python语言程序设计,第9章Python标准库概览...
  8. python生成shell脚本_Python设置在shell脚本中自动补全功能的方法
  9. 华为主题包hwt下载_华为主题太丑?修改方式它来了
  10. Python学习笔记:闭包与作用域