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)

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值