Go --- go-elasticsearch介绍及简单使用

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Go --- go-elasticsearch介绍及简单使用

介绍

go-elasticsearch时Elasticsearch的官方Go客户端。

可以直接调用官方准备好的api。简单易用。

兼容性

语言客户端是向前兼容的,这代表这客户端可以和更高或是相等版本的Elasticsearch进行通讯。简单来说就是,允许使用7.X的Elasticsearch的语言客户端何以访问8.X的Elasticsearch。

相关文档

如果想要了解详情,建议阅读官方文档。本文只是简单的介绍该包的使用。

GitHub - elastic/go-elasticsearch:Elasticsearch 的官方 Go 客户端

esapi package - github.com/elastic/go-elasticsearch/esapi - Go Packages

go-elasticsearch/_examples at main ·elastic/go-elasticsearch ·GitHub

使用

安装

可以使用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

配置客户端

一个默认配置的客户端,请求并接受响应。

es, _ := elasticsearch.NewDefaultClient()
  res, _ := es.Info()
  defer res.Body.Close()
  log.Println(res)

当然客户端也可以根据自己的需要自行配置,如下

// 自定义配置
cfg := elasticsearch.Config{
   // 有多个节点时需要配置
   Addresses: []string{
      "http://localhost:9200",
   },
   // 配置HTTP传输对象
   Transport: &http.Transport{
      //MaxIdleConnsPerHost 如果非零,控制每个主机保持的最大空闲(keep-alive)连接。如果为零,则使用默认配置2。
      MaxIdleConnsPerHost:   10,
      //ResponseHeaderTimeout 如果非零,则指定在写完请求(包括请求体,如果有)后等待服务器响应头的时间。
      ResponseHeaderTimeout: time.Second,
      //DialContext 指定拨号功能,用于创建不加密的TCP连接。如果DialContext为nil(下面已弃用的Dial也为nil),那么传输拨号使用包网络。
      DialContext:           (&net.Dialer{Timeout: time.Second}).DialContext,
      // TLSClientConfig指定TLS.client使用的TLS配置。
      //如果为空,则使用默认配置。
      //如果非nil,默认情况下可能不启用HTTP/2支持。
      TLSClientConfig: &tls.Config{
         MaxVersion:         tls.VersionTLS11,
         //InsecureSkipVerify 控制客户端是否验证服务器的证书链和主机名。
         InsecureSkipVerify: true,
      },
   },
}
es, _ := elasticsearch.NewClient(cfg)
res, _ := es.Info()
defer res.Body.Close()
log.Println(res

CRUD

新增文档

使用 index api对文档进行增添或是修改操作。如果id不存在为创建文档,如果文档存在则进行修改。

es, _ := elasticsearch.NewDefaultClient()
// 在索引中创建或更新文档。
res, err := es.Index(
   "test",                                  // Index name
   strings.NewReader(`{"title" : "Test"}`),    // Document body
   es.Index.WithDocumentID("1"),               // Document ID
   //es.Index.WithRefresh("true"),               // Refresh
)
if err != nil {
   log.Fatalf("ERROR: %s", err)
}
defer res.Body.Close()
log.Println(res)

也可以使用esapi进行请求的包装,然后使用Do()方法执行请求。我们做同上面一样的操作,如下

es, _ := elasticsearch.NewDefaultClient()
req := esapi.IndexRequest{
   Index:      "test",                                  // Index name
   Body:       strings.NewReader(`{"title" : "Test"}`), // Document body
   DocumentID: "1",                                     // Document ID
   Refresh:    "true",                                  // Refresh
}
res, err := req.Do(context.Background(), es)
if err != nil {
   log.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()
log.Println(res)

PUT /test/_doc/1
{
  "title": "Test"
}

下面都将之使用esapi方法实现。

不覆盖的创建文档

如果不想因为在创建文档填写错了id而对不想进行操作的文档进行了修改,那么可以使用CreateRequest包装请求。

es, _ := elasticsearch.NewDefaultClient()
   req := esapi.CreateRequest{
      Index:        "learn",
      DocumentType: "user",
      DocumentID:   "1",
      Body: strings.NewReader(`
{
   "name": "张三",
   "age": 25,
   "about": "一个热爱刑法的男人,但是不精通唱跳Rap"
}`),
   }
   res, err := req.Do(context.Background(), es)
   if err != nil {
      log.Println("出错了,这个你麻麻滴错误是", err)
   }
   log.Println(res)

查询文档

查询单个文档

使用GetRequest包装请求。

es, _ := elasticsearch.NewDefaultClient()
req := esapi.GetRequest{
   Index: "learn",
   DocumentType: "user",
   DocumentID: "1",
}
res, err := req.Do(context.Background(), es)
if err != nil {
   log.Fatalf("ERROR: %s", err)
}
defer res.Body.Close()
log.Println(res)

GET /learn/user/1
查询多个文档

使用MgetRequest包装请求。

es, _ := elasticsearch.NewDefaultClient()
   request := esapi.MgetRequest{
      Index:        "learn",
      DocumentType: "user",
      Body:         strings.NewReader(`{
  "docs": [
    {
      "_id": "1"
    },
    {
      "_id": "2"
    }
  ]
}`),
   }
   res, err := request.Do(context.Background(), es)
   if err != nil {
      log.Println("出错了,错误是", err)
   }
   log.Println(res)

修改文档

在上面我们已经进行了创建或者修改的操作,但是使用 index api进行的修改操作需要提供所有的字段,不然会返回 400。但我们大多数时候只是进行单个字段或多个字段的修改,并不会修改整个文档,这时候我们可以使用UpdateRequest包装请求。

es, _ := elasticsearch.NewDefaultClient()
   req := esapi.UpdateRequest{
      Index:        "learn",
      DocumentType: "user",
      DocumentID:   "1",
      Body: strings.NewReader(`
{
   "doc": {
   "name": "张三"
   }
}`),
   }
   res, err := req.Do(context.Background(), es)
   if err != nil {
      log.Println("出错了,这个你麻麻滴错误是", err)
   }
   log.Println(res)

删除文档

使用DeleteRequest包装请求。

// 创建一个默认配置的客户端
es, _ := elasticsearch.NewDefaultClient()
// 使用index请求
req := esapi.DeleteRequest{
   Index: "test",
   DocumentType: "_doc",
   DocumentID: "1",
}
res, err := req.Do(context.Background(), es)
if err != nil {
   log.Fatalf("ERROR: %s", err)
}
defer res.Body.Close()
log.Println(res)

DELETE /test/_doc/1

批量操作

使用BulkRequest包装请求。

es, _ := elasticsearch.NewDefaultClient()
   // 使用index请求
   req := esapi.BulkRequest{
      // 在body中写入bulk请求
      Body: strings.NewReader(`{ "index" : { "_index" : "test", "_id" : "1" } }
{ "title" : "Test2" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
`),
   }
   res, err := req.Do(context.Background(), es)
   if err != nil {
      log.Fatalf("ERROR: %s", err)
   }
   defer res.Body.Close()
   log.Println(res)

注意:格式一定要按照bulk api的格式来写,不然会400,最后别忘了回车

上面请求同

PUT /_bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "title" : "Test2" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

搜索

使用SearchRequest对请求进行包装。

es, _ := elasticsearch.NewDefaultClient()
   req := esapi.SearchRequest{
      Index:        []string{"learn"},
      DocumentType: []string{"user"},
      Body:         strings.NewReader(`{
  "query": {
    "match": {
      "about": "唱跳"
    }
  }
}`),
   }
   response, err := req.Do(context.Background(), es)
   if err != nil {
      log.Println("出错了,这个你麻麻滴错误是", err)
   }
   log.Println(response)


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
关系型数据库 MySQL Go
使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch
本文介绍如何使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch。1.go-mysql-elasticsearch简介go-mysql-elasticsearch是一个将MySQL数据自动同步到Elasticsearch的服务。
4213 0
|
存储 消息中间件 监控
(20)go-micro微服务Elasticsearch使用
(20)go-micro微服务Elasticsearch使用
117 0
|
JSON 搜索推荐 Go
Go项目优化——使用Elasticsearch搜索引擎
Go项目优化——使用Elasticsearch搜索引擎
121 0
Go项目优化——使用Elasticsearch搜索引擎
玩转Elasticsearch—Go整合ES7.16.2
玩转Elasticsearch—Go整合ES7.16.2
|
Go 索引
Go一分钟对接ElasticSearch实践
今天这篇分享:使用Go语言对接ElasticSearch实践。
382 0
玩转Elasticsearch—Go整合ES7.16.2
玩转Elasticsearch—Go整合ES7.16.2
429 0
玩转Elasticsearch—Go整合ES7.16.2
|
数据可视化 关系型数据库 MySQL
go-mysql-elasticsearch实现mysql 与elasticsearch实时同步深入详解
引言: go-mysql-elasticsearch 是国内作者开发的一款插件。测试表明:该插件优点:能实现同步增、删、改、查操作。不足之处(待完善的地方): 1、仍处理开发、相对不稳定阶段; 2、没有日志,不便于排查问题及查看同步结果。 本文深入详解了插件的安装、使用、增删改查同步测试。
364 0
|
MySQL 测试技术 关系型数据库
go-mysql-elasticsearch实现mysql 与elasticsearch实时同步深入详解
本文深入详解了插件的安装、使用、增删改查同步测试。
911 0
|
3天前
|
安全 测试技术 Go
Go语言在高并发场景下的应用
在当今互联网高速发展的时代,高并发已成为众多应用系统面临的核心问题。本文探讨了Go语言在高并发场景下的优势,并通过具体实例展示了其在实际应用中的效果和性能表现。
|
2天前
|
存储 中间件 Go
在go语言服务中封装路由和示例
【6月更文挑战第23天】本文介绍golang后端按协议处理、中间件(一次性与每次请求执行)划分、以及服务架构Controller、Logic/Service、DAO/Repository和Routers划分。代码仓库在GitHub上提供。使用框架简化了交互和处理。后续章节深入探讨服务构建。
103 5
在go语言服务中封装路由和示例