用 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.pswp.cn/pingmian/91448.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《义龙棒球科普》棒球是韩国的国球吗·棒球1号位

⚾ Why Baseball is Koreas NATIONAL SPORT? | KBO热血全解析 ⚾⚾ 1. 历史根源 & 情感纽带 Historical Roots & Emotional Bond美军引入 (1945后): 战后美军将棒球带入韩国,迅速扎根!✨1982 KBO成立: 亚洲第二个职业棒球联盟诞生!奥…

三坐标测量机路径规划与补偿技术:如何用算法看见微米级误差?

三坐标测量的微米级精度背后,是精密的路径规划算法与实时补偿技术在保驾护航。三坐标测量机的智能避撞算法保障了测量的安全与高效;温度补偿技术消除了环境的无形干扰;点云智能处理则让海量数据蜕变为精准的工程决策依据。 “智能避让路径”&…

Docker设置容器时间

一、前言前言&#xff1a;容器搭建好之后&#xff0c;容器的默认时区于本地时区不一致&#xff0c;这将导致日志文件中保存的时间为错误时间。二、操作1、进入docker 容器docker exec -it <容器名称> bash2、选择时区tzselect3、配置时区根据跳出来的配置选择Asia -> …

德国威乐集团亚太中东非洲PMO负责人和继明受邀为PMO大会主持人

全国PMO专业人士年度盛会德国威乐集团亚太中东非洲PMO负责人 和继明先生 受邀为“PMO评论”主办的2025第十四届中国PMO大会主持人&#xff0c;敬请关注&#xff01;嘉宾介绍&#xff1a;和继明先生&#xff0c;德国威乐集团亚太中东非洲PMO负责人&#xff0c;项目管理硕士MPM&a…

idea 集成飞算Java AI 教程

idea 集成飞算Java AI 教程一、介绍二、下载安装 飞算Java AI 插件方式一&#xff1a;从idea插件市场安装方式二&#xff1a;下载离线安装包三、飞算Java AI插件使用一、介绍 ​ 随着人工智能技术的发展&#xff0c;AI 编程助手逐渐成为提升开发效率的强大工具。上一篇教程是i…

2025.8.1

代码练习 //用指针访问对象成员 #include<iostream> #include<string> using namespace std; class Champion { public:Champion(int id, string nm, int hp, int mn, int dmg) {ID id;name nm;HP hp;mana mn;damage dmg;}void attack(Champion& chmp) {c…

一种新的分布式ID生成方案--ULID

一种新的分布式ID生成方案 ULID: 一种新的分布式ID生成方案 ULID (Universally Unique Lexicographically Sortable Identifier) 是一种较新的分布式ID生成方案&#xff0c;旨在解决传统UUID和雪花算法(Snowflake)的一些局限性。ULID的主要特点 可排序性&#xff1a;ULID按生成…

服务器中涉及节流(Throttle)的硬件组件及其应用注意事项

服务器中涉及节流&#xff08;Throttle&#xff09;的硬件组件及其应用注意事项 在服务器硬件中&#xff0c;“节流”&#xff08;throttling&#xff09;是一种保护机制&#xff0c;当组件温度过高、功耗过大或超出安全阈值时&#xff0c;系统会自动降低性能&#xff08;如时钟…

GitPython07-源码解读

GitPython07-源码解读1 1-核心知识 1&#xff09;从核心代码的第一行作为突破口2&#xff09;从Repo.init方法入手做追踪3&#xff09;subprocess到底做了什么&#xff1f;gitPython是不是执行的脚本&#xff0c;最终还是通过subprocess做到的4&#xff09;代码中貌似并没有实…

Java继承机制详解:从原理到实战应用

一、继承的本质&#xff1a;消除冗余&#xff0c;构建逻辑关系想象一个公司管理系统&#xff1a;普通销售员工&#xff08;CommissionEmployee&#xff09;和带底薪销售员工&#xff08;BasePlusCommissionEmployee&#xff09;共享大部分属性&#xff08;姓名、工号、销售额、…

工业数采引擎-DTU

DTU配置注册包及心跳包(对应设备配置->设备SN)&#xff0c;模块工作方式&#xff1a;TcpClient&#xff0c;首次连接成功后&#xff0c;DTU发送上来的注册包作为链路SessionId1. ModbusRtu设备 -> Dtu -> Server2. DLT645设备 -> Dtu -> Server3. 自定义设备 -&…

AttributeError: ChatGLMTokenizer has no attribute vocab_size

请问运行下面语句tokenizer AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_codeTrue) 出现“AttributeError: ChatGLMTokenizer has no attribute vocab_size”是版本不一致&#xff0c;需要旧的版本卸载conda uninstall transformers或者pip un…

14.串口更新FLASH字库

一、简介 在使用STM32等单片机驱动显示屏时&#xff0c;为了显示中文字体&#xff0c;常用FLASH保存字库信息。但是字库的更新通常只能使用SD卡更新&#xff0c;在一些小型单片机系统(如STM32F103C8T6、STC89C52)上&#xff0c;没有增加SD卡支持的必要。为解决此问题&#xff0…

Lombok常用注解及功能详解

Lombok常用注解及功能详解一、Lombok简介与环境配置1.1 什么是Lombok&#xff1f;1.2 环境配置1.2.1 Maven项目1.2.2 Gradle项目1.2.3 IDE配置&#xff08;关键&#xff09;二、Lombok常用注解详解2.1 Data&#xff1a;一站式生成核心方法2.2 Getter/Setter&#xff1a;单独生成…

应用分层

应用分层是⼀种软件开发设计思想&#xff0c;它将应用程序分成N个层次&#xff0c;这N个层次分别负责各自的职责&#xff0c; 多个层次之间协同提供完整的功能。根据项目的复杂度&#xff0c;把项目分成三层&#xff0c;四层或者更多层。常见的MVC设计模式&#xff0c;就是应用…

[特殊字符] 【JAVA进阶】StringBuilder全方位解析:从使用到源码,一文搞定!

&#x1f525; 掌握StringBuilder&#xff0c;让你的Java字符串操作性能飙升&#xff01;&#x1f9e9; StringBuilder是什么&#xff1f; StringBuilder是Java中用于动态构建字符串的可变字符序列类&#xff0c;位于java.lang包中。与不可变的String类不同&#xff0c;StringB…

Redis 数据结构全景解析

Redis 不是简单的 key-value 缓存&#xff0c;它更像一把“瑞士军刀”。 只要掌握数据结构&#xff0c;就能把同一份内存用出 10 倍效率。0. 开场白&#xff1a;为什么聊数据结构&#xff1f; 面试常问“Redis 有几种数据类型&#xff1f;”——很多人答 5 种&#xff08;Strin…

ansible.cfg 配置文件的常见配置项及其说明

配置项说明默认值defaults默认配置部分inventory指定清单文件的位置&#xff0c;可以是文件路径、目录或动态清单脚本。/etc/ansible/hostsremote_user默认的远程用户roothost_key_checking是否启用主机密钥检查。设置为 False 跳过 SSH 主机密钥验证。Trueask_pass是否在执行时…

Effective C++ 条款15:在资源管理类中提供对原始资源的访问

Effective C 条款15&#xff1a;在资源管理类中提供对原始资源的访问核心思想&#xff1a;RAII类需要提供访问其封装原始资源的显式或隐式接口&#xff0c;以兼容需要直接操作资源的API&#xff0c;同时维持资源的安全管理。 ⚠️ 1. 原始资源访问的必要性 使用场景示例&#x…

Linux 进程管理与计划任务设置

Linux 进程管理与计划任务设置一、进程管理进程管理用于监控、控制系统中运行的程序&#xff08;进程&#xff09;&#xff0c;包括查看进程状态、调整优先级、终止异常进程等。以下是核心命令及操作说明&#xff1a;1. 常用进程查看命令&#xff08;1&#xff09;ps&#xff1…