Contents

go第三方库-github.com.elastic.go-elasticsearch

godoc

github官方

客户端支持与大于等于其版本的 Elasticsearch

子包esapi调用 Elasticsearch API ,子包elastictransport通过 HTTP 传输数据

连接服务端

elasticsearch.NewDefaultClient()函数创建具有默认设置的客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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)
}

defer res.Body.Close()
log.Println(res)

关闭响应体并消费它使得 HTTP 传输中重新使用持久 TCP 连接。

调用io.Copy(ioutil.Discard, res.Body)可以清除响应体

可以设置ELASTICSEARCH_URL环境变量,将用于设置集群端点。用逗号分隔多个地址。

以编程方式设置集群端点,将配置对象传递给elasticsearch.NewClient()函数

1
2
3
4
5
6
7
8
cfg := elasticsearch.Config{
  Addresses: []string{
    "https://localhost:9200",
    "https://localhost:9201",
  },
  // ...
}
es, err := elasticsearch.NewClient(cfg)

配置对象可以包含用户名和密码属性

1
2
3
4
5
cfg := elasticsearch.Config{
  // ...
  Username: "foo",
  Password: "bar",
}

CACert配置属性用于设置签署集群节点证书的自定义证书颁发机构

1
2
3
4
5
6
cert, _ := ioutil.ReadFile(*cacert)

cfg := elasticsearch.Config{
  // ...
  CACert: cert,
}

CertificateFingerprint配置属性设置指纹以验证 HTTPS 连接

1
2
3
4
cfg := elasticsearch.Config{
	// ...
    CertificateFingerprint: fingerPrint,
}

传输层配置通过给Transport属性一个http.Transport对象的地址

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cfg := elasticsearch.Config{
  Transport: &http.Transport{
    MaxIdleConnsPerHost:   10,
    ResponseHeaderTimeout: time.Second,
    TLSClientConfig: &tls.Config{
      MinVersion: tls.VersionTLS12,
      // ...
    },
    // ...
  },
}

插入数据

使用esapi来生成不同es请求对象,下面这个对象用于给es插入文档

1
2
3
4
5
6
7
// Set up the request object.
req := esapi.IndexRequest{
  Index:      "test",
  DocumentID: strconv.Itoa(i + 1),
  Body:       bytes.NewReader(data),
  Refresh:    "true",
}

发送ES请求,res为返回数据包

1
2
3
4
5
// Perform the request with the client.
res, err := req.Do(context.Background(), es)
if err != nil {
  log.Fatalf("Error getting response: %s", err)
}

res.IsError()判断es服务端执行时是否出现错误

res.Body为返回json字符串,可用于json解析

查询

通过查询对象生成json字面量,用于查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Build the request body.
var buf bytes.Buffer
query := map[string]interface{}{
  "query": map[string]interface{}{
    "match": map[string]interface{}{
      "title": "test",
    },
  },
}
if err := json.NewEncoder(&buf).Encode(query); err != nil {
  log.Fatalf("Error encoding query: %s", err)
}

执行查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Perform the search request.
res, err = es.Search(
  es.Search.WithContext(context.Background()),
  es.Search.WithIndex("test"),
  es.Search.WithBody(&buf),
  es.Search.WithTrackTotalHits(true),
  es.Search.WithPretty(),
)
if err != nil {
  log.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()

esapi

esapi包允许以两种不同的方式调用 Elasticsearch API:

  • 通过创建一个结构,例如IndexRequest,并通过将上下文和客户端传递给它来调用其Do()方法
  • 或者通过调用Search()函数客户端直接使用选项功能,例如WithIndex().
 |