说明
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 && cd go-elasticsearch
一个完整的示例:
mkdir my-elasticsearch-app && cd my-elasticsearch-app
cat > go.mod <<-END
module my-elasticsearch-app
require github.com/elastic/go-elasticsearch v0.0.0
END
cat > main.go <<-END
package main
import (
"log"
"github.com/elastic/go-elasticsearch"
)
func main() {
es, _ := elasticsearch.NewDefaultClient()
log.Println(es.Info())
}
END
go run main.go
用法
elasticsearch
包与另外两个包绑定在一起,esapi
用于调用 Elasticsearch 的 API,estransport
通过 HTTP 传输数据。
使用elasticsearch.NewDefaultClient()
函数创建带有以下默认设置的客户端:
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)
}
log.Println(res)
// [200 OK] {
// "name" : "node-1",
// "cluster_name" : "go-elasticsearch"
// ...
注意:当导出ELASTICSEARCH_URL
环境变量时,它将被用作集群端点。
使用elasticsearch.NewClient()
函数(仅用作演示)配置该客户端:
cfg := elasticsearch.Config{
Addresses: []string{
"http://localhost:9200",
"http://localhost:9201",
},
Transport: &http.Transport{
MaxIdleConnsPerHost: 10,
ResponseHeaderTimeout: time.Second,
DialContext: (&net.Dialer{Timeout: time.Second}).DialContext,
TLSClientConfig: &tls.Config{
MaxVersion: tls.VersionTLS11,
InsecureSkipVerify: true,
},
},
}
es, err := elasticsearch.NewClient(cfg)
// ...
下面的示例展示了更复杂的用法。它从集群中获取 Elasticsearch 版本,同时索引几个文档,并使用响应主体周围的一个轻量包装器打印搜索结果。
// $ go run _examples/main.go
package main
import (
"context"
"encoding/json"
"log"
"strconv"
"strings"
"sync"
"github.com/elastic/go-elasticsearch"
"github.com/elastic/go-elasticsearch/esapi"
)
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("Error creating the client: %s", err)
}
// 1. Get cluster info
//
res, err := es.Info()
if err != nil {
log.Fatalf("Error getting response: %s", err)
}
// Deserialize the response into a map.
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
log.Fatalf("Error parsing the response body: %s", err)
}
// Print version number.
log.Printf("~~~~~~~> Elasticsearch %s", r["version"].(map[string]interface{})["number"])
// 2. Index documents concurrently
//
for i, title := range []string{"Test One", "Test Two"} {
wg.Add(1)
go func(i int, title string) {
defer wg.Done()
// Set up the request object directly.
req := esapi.IndexRequest{
Index: "test",
DocumentID: strconv.Itoa(i + 1),
Body: strings.NewReader(`{"title" : "` + title + `"}`),
Refresh: "true",
}
// Perform the request with the client.
res, err := req.Do(context.Background(), es)
if err != nil {
log.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()
if res.IsError() {
log.Printf("[%s] Error indexing document ID=%d", res.Status(), i+1)
} else {
// Deserialize the response into a map.
var r map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
log.Printf("Error parsing the response body: %s", err)
} else {
// Print the response status and indexed document version.
log.Printf("[%s] %s; version=%d", res.Status(), r["result"], int(r["_version"].(float64)))
}
}
}(i, title)
}
wg.Wait()
log.Println(strings.Repeat("-", 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("test"),
es.Search.WithBody(strings.NewReader(`{"query" : { "match" : { "title" : "test" } }}`)),
es.Search.WithTrackTotalHits(true),
es.Search.WithPretty(),
)
if err != nil {
log.Fatalf("ERROR: %s", err)
}
defer res.Body.Close()
if res.IsError() {
var e map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&e); err != nil {
log.Fatalf("error parsing the response body: %s", err)
} else {
// Print the response status and error information.
log.Fatalf("[%s] %s: %s",
res.Status(),
e["error"].(map[string]interface{})["type"],
e["error"].(map[string]interface{})["reason"],
)
}
}
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
log.Fatalf("Error parsing the response body: %s", err)
}
// Print the response status, number of results, and request duration.
log.Printf(
"[%s] %d hits; took: %dms",
res.Status(),
int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64)),
int(r["took"].(float64)),
)
// Print the ID and document source for each hit.
for _, hit := range r["hits"].(map[string]interface{})["hits"].([]interface{}) {
log.Printf(" * ID=%s, %s", hit.(map[string]interface{})["_id"], hit.(map[string]interface{})["_source"])
}
log.Println(strings.Repeat("=", 37))
}
// ~~~~~~~> 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
更多内容推荐
使用 Ingest Pipeline 在 Elasticsearch 中对数据进行预处理
Ingest pipeline 允许文档在被索引之前对数据进行预处理,将数据加工处理成我们需要的格式。例如,可以使用 ingest pipeline添加或者删除字段,转换类型,解析内容等等。
2023-02-16
Go-Excelize API 源码阅读(九)——SetSheetBackground(sheet, picture string)
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带
2022-08-13
Andriod 网络框架 OkHttp 源码解析,总结一下
除了使用上面的直接实例化一个 OkHttp 客户端的方式,我们也可以使用 OkHttpClient 的构建者 OkHttpClient.Builder 来创建 OkHttp 客户端。
2021-11-08
Elasticsearch Mapping Root Object
Elasticsearch Mapping Root Object,内容来自 B 站中华石杉 Elasticsearch 顶尖高手系列课程核心知识篇,英文内容来自 Elasticsearch: The Definitive Guide [2.x],在新的版本中 Mapping types have been removed。
2021-03-07
数字化驱动,低代码引领:探索数智时代的开发新纪元!
在数智时代的背景下,人工智能与大数据技术的蓬勃发展正催生着各行各业的变革与创新。作为一种引领数字化转型的核心技术,AIGC(Artificial Intelligence and Big Data、Internet of Things、Cloud Computing)正为社会带来了前所未有的便利与机遇。
2023-06-28
Android-OkHttp- 史上最优雅的设置 baseUrl(1),android 开发视频播放代码
如果你的项目中只有一个BaseUrl,那么只需要使用@DefaultDomain注解即可,如下:
2021-11-05
03|架构概述:一个监控系统的典型架构是什么样的?
监控系统由哪些模块组成,各个模块是如何相互协同的
2023-01-13
Elasticsearch Doc Values 和 doc_values
Elasticsearch Doc Values 和 doc_values,内容来自 B 站中华石杉 Elasticsearch 顶尖高手系列课程核心知识篇,英文内容来自 Elasticsearch: The Definitive Guide [2.x] 和当前版本官方文档。
2021-02-27
18|组件监控:Kubernetes 控制面组件的关键指标与数据采集
Kubernetes 控制面组件的关键指标与数据采集
2023-02-17
24|从集群角度拆解 RocketMQ 的架构设计与实现
解析 RocketMQ 在集群构建、部署形态、数据可靠性、安全控制、可观测性等五个方面的设计实现。
2023-08-14
Django 笔记四十一之 Django 中使用 es
本篇笔记主要介绍如何在 Django 中使用 Elasticsearch
2023-06-02
第 11 期 | GPTSecurity 周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。
2023-10-25
腾讯云大数据 ES:一文秒懂!使用 Elasticsearch 进行数据分析
在数据分析场景,Elasticsearch也提供了聚合Aggregations API支持完成复杂的查询分析,并且可以使用Kibana完成数据的可视化。本文就如何使用Elasticsearch进行数据分析做一个简单的介绍。
2023-10-08
23|从集群角度拆解 RabbitMQ 的架构设计与实现
详解RabbitMQ在集群构建、数据可靠性、数据安全、集群可观测性等四大模块的实现。
2023-08-11
07|如何解决 Prometheus 的存储容量问题?
如何扩展 Prometheus 的存储
2023-01-23
26|从集群角度拆解 Pulsar 的架构设计与实现
Pulsar 作为 Kafka 的升级替代品,它主要解决了 Kafka 在集群层面的弹性和规模限制问题。
2023-08-18
Elasticsearch Bulk API 奇特的 JSON 格式
为社么 Elasticsearch 的 Bulk 批量操作要采用看上去很奇怪的 JSON 格式?文字内容来自 B 站中华石杉 Elasticsearch 高手进阶课程
2021-02-04
InfoQ 技术编辑
推荐阅读
第 23 期 | GPTSecurity 周报
2023-11-02
39|Elasticsearch 高可用:怎么保证 Elasticsearch 的高可用?
2023-09-20
一起学 Elasticsearch 系列 - 核心概念
2023-11-06
41|容灾:如何实现跨地域、跨可用区的容灾和同步?
2023-09-22
百家国企走进云投集团,探索世界 500 强数智化转型之路
2023-11-10
5. 基于 Kubeadm 及 Kubespray 安装高可用集群
2023-09-26
用友携手平安银行,加速数智化司库及财资体系建设
2023-11-06
电子书
大厂实战PPT下载
换一换 邓艳琴(Clara) | 极客邦科技 会议主编
冉小龙 | 腾讯云 高级研发工程师、Apache Pulsar Committer
陈凯悦 | 腾讯云 容器高级开发工程师
评论 1 条评论