当前位置: 首页 > news >正文

用 Go Typed Client 快速上手 Elasticsearch —— 从建索引到聚合的完整实战

1. 准备工作

go get github.com/elastic/go-elasticsearch/v9

小贴士

  • 如果你的集群启用了安全特性,需要在 elasticsearch.Config 中配置 Username/PasswordAPIKey
  • Typed Client 通过 NewTypedClient 创建,内部复用 *http.Client,建议全局单例化,避免频繁建立连接。
cfg := elasticsearch.Config{Addresses: []string{"https://es.local:9200"},Username:  "elastic",Password:  "mypassword",// APIKey: "…", 二选一
}
es, _ := elasticsearch.NewTypedClient(cfg)

2. 创建索引并映射字段

import ("context""github.com/elastic/go-elasticsearch/v9/typedapi/indices/create""github.com/elastic/go-elasticsearch/v9/typedapi/types"
)_, err := es.Indices.Create("test-index").Request(&create.Request{Mappings: &types.TypeMapping{Properties: map[string]types.Property{"price": types.NewIntegerNumberProperty(), // 自动设置 "type":"integer"},},}).Do(context.Background())
if err != nil { /* 处理异常 */ }

要点

关键点说明
types.NewIntegerNumberProperty()Builder 会自动注入 type=integer,避免手写字符串
.Request()接收强类型结构体,写错字段编译期即报错
.Do(ctx)统一执行入口,返回 *Responseerror

3. 写入文档

3.1 直接传递结构体(最常用)

doc := struct {Id    int    `json:"id"`Name  string `json:"name"`Price int    `json:"price"`
}{1, "Foo", 10}if _, err := es.Index("test-index").Request(doc).Do(context.Background()); err != nil {log.Fatal(err)
}

3.2 传递已序列化的 JSON

payload := []byte(`{"id":1,"name":"Foo","price":10}`)
_, err := es.Index("test-index").Raw(payload).Do(context.Background())

适用于手动拼装性能敏感场景,跳过 encoding/json 二次编码。

4. 读取文档

resp, err := es.Get("test-index", "1").Do(context.Background())
if err != nil {}
fmt.Printf("Source=%s\n", resp.Source_)

5. 判断文档是否存在

ok, err := es.Exists("test-index", "1").IsSuccess(context.Background())
switch {
case err != nil:// 请求失败
case ok:fmt.Println("文档存在")
default:fmt.Println("文档不存在")
}

IsSuccess 通过 HTTP 状态码 判断,内部已处理 404 与重定向。

6. 搜索

6.1 使用强类型 Request 构建 DSL

import "github.com/elastic/go-elasticsearch/v9/typedapi/search"resp, err := es.Search().Index("test-index").Request(&search.Request{Query: &types.Query{Match: map[string]types.MatchQuery{"name": {Query: "Foo"},},},}).Do(context.Background())

生成的 DSL

{"query": { "match": { "name": { "query": "Foo" } } }
}

6.2 快速解析命中

for _, hit := range resp.Hits.Hits {var d struct {Name  string `json:"name"`Price int    `json:"price"`}if err := json.Unmarshal(hit.Source_, &d); err != nil {}fmt.Printf("%s => %d\n", d.Name, d.Price)
}

7. 聚合 —— 求价格总和

total, err := es.Search().Index("test-index").Request(&search.Request{Size: some.Int(0), // 只要聚合结果,不要文档Aggregations: map[string]types.Aggregations{"total_prices": {Sum: &types.SumAggregation{Field: some.String("price")},},},}).Do(context.Background())
if err != nil {}sum := total.Aggregations.Sum("total_prices").Value
fmt.Printf("价格总和:%.0f\n", *sum)
  • some.Int(0)some.String() 是 Typed API 的 可空包装器,避免 *int 指针声明的繁琐。
  • 结果通过 Aggregations.Sum("name") 类型安全地取出,无需手写 map 断言。

8. 进阶实践 & 性能建议

  1. 单例客户端:在 main() 或 DI 容器里初始化一次,复用连接池。
  2. Context 超时:在高并发场景用 context.WithTimeout 控制慢查询。
  3. Bulk 批量索引:大规模写入请使用 es.Bulk() + 并行 worker。
  4. 显式 Refresh:测试场景可在写入后 .Refresh("wait_for"),生产环境由索引刷新策略决定。
  5. Typed vs. Raw:Typed API 更安全、可读;Raw/Low-level Client 更灵活。可按模块混用。

9. 小结

  • Typed Request + Builder 让映射、DSL、聚合都拥有 IDE 自动补全和编译期校验。
  • 常见场景(建索引 / CRUD / Search / Aggs)几乎只需一两行链式调用即可搞定。
  • 掌握 some 包 的可空包装器、IsSuccess 以及 Do(ctx) 的范式,能写出既易读又健壮的 Go-ES 代码。

一步到位搭建起 Go × Elasticsearch 的类型安全数据层,让你的业务逻辑远离魔法字符串,尽享编译器的守护!

http://www.lryc.cn/news/604795.html

相关文章:

  • 8.Linux : 日志的管理与时钟同步的配置
  • Rabbit MQ的消息模式-Java原生代码
  • YOLO-01目标检测基础
  • 02 基于sklearn的机械学习-特征降维(特征选择、PCA)、KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)
  • Android调用python库和方法的实现
  • YOLOv5u:无锚点检测的革命性进步
  • android-PMS-创建新用户流程
  • 舆情监测专员需要哪些常用软件工具?
  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(一)
  • 论文Review 3DGSSLAM S3PO-GS | ICCV 2025 港科广出品!| 高效快速的3DGSSLAM!
  • sqli-labs:Less-1关卡详细解析
  • CMS框架漏洞
  • 3D Web轻量化引擎HOOPS Communicator数据处理与流式加载能力概述
  • 【音视频】WebRTC-Web 音视频采集与播放
  • 【预判一手面试问题:排序】
  • 依托客户满意度分析协助企业精准把握市场趋势​(满意度调查)
  • 智能AI医疗物资/耗材管理系统升级改造方案分析
  • InfluxDB 与 Java 框架集成:Spring Boot 实战(二)
  • VSCode插件开发完整教程:从零开始创建文件导出插件
  • Python 程序设计讲义(37):字符串的处理方法——设置字符串居中显示:center() 方法
  • 图像平滑处理
  • 9.项目起步(3)
  • OpenCV学习day1
  • 实习小记(个人中心的编辑模块)
  • 商标注册后可以随意更改字体和颜色吗!
  • 怎么理解锁相环主时钟(PLL)怎么做到对时钟进行倍频?
  • Keil STM32工程各文件作用
  • AI框架工具FastRTC快速上手2——整体框架及Stream类详解
  • 方块世界:失落文明的遗产
  • Deforum Stable Diffusion,轻松实现AI视频生成自由!