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().