1 为什么需要两种写法?

在 Golang 项目中访问 Elasticsearch,一般会遇到两类需求:

需求场景特点最佳写法
后台服务 / 业务逻辑查询固定、字段清晰,需要编译期保障Request 结构体
仪表盘 / 高级搜索 / 模板 DSL查询片段由前端或脚本动态生成,或要沿用历史 JSON 文件Raw JSON

Typed Client 同时提供两种 API:.Request(&req).Raw([]byte),互不冲突,互有侧重。

2 使用强类型 Request —— 类型安全 + IDE 补全

2.1 代码示例:搜索 name="Foo"

package mainimport ("context""encoding/json""fmt""log"typedapi "github.com/elastic/go-elasticsearch/v8/typedapi""github.com/elastic/go-elasticsearch/v8/typedapi/search""github.com/elastic/go-elasticsearch/v8/typedapi/types"
)type Product struct {Name  string  `json:"name"`Price float64 `json:"price"`
}func main() {// 1) 创建 Typed Clientes, _ := typedapi.NewTypedClient(typedapi.Config{Addresses: []string{"http://localhost:9200"},})// 2) 构造强类型请求体req := search.Request{Query: &types.Query{Term: map[string]types.TermQuery{"name": {Value: "Foo"},},},}// 3) 发送查询res, err := es.Search().Index("products").Size(10).Request(&req).          // ← 传入 Request 结构体Do(context.Background())if err != nil {log.Fatalf("search: %v", err)}defer res.Body.Close()// 4) 解析响应(Raw → 业务结构体)var body struct {Hits struct {Hits []struct {Source Product `json:"_source"`} `json:"hits"`} `json:"hits"`}_ = json.NewDecoder(res.Body).Decode(&body)for _, hit := range body.Hits.Hits {fmt.Printf("%+v\n", hit.Source)}
}
2.2 优缺点
优点说明
编译期校验DSL 字段、类型、枚举均受 Go 类型系统约束
IDE 智能提示自动补全复杂结构(Query, Sort, Aggregation 等)
易于重构字段改动立即触发编译错误,避免运行期踩坑
注意点说明
依赖 spec 版本新 API 字段需等待官方更新 elasticsearch-specification 生成代码
编码速度初学者需花时间熟悉类型层级

3 使用 Raw JSON —— 复用模板 / 自定义编码

3.1 代码示例:用户 ID 精确匹配

package mainimport ("context""fmt""log"typedapi "github.com/elastic/go-elasticsearch/v8/typedapi"
)func main() {es, _ := typedapi.NewTypedClient(typedapi.Config{Addresses: []string{"http://localhost:9200"},})// Mustache / Kibana 导出的查询片段rawQuery := []byte(`{"query": {"term": {"user.id": {"value": "kimchy","boost": 1.0}}}}`)res, err := es.Search().Index("twitter").Raw(rawQuery).          // ← 直接塞入 JSONDo(context.Background())if err != nil {log.Fatalf("search: %v", err)}defer res.Body.Close()fmt.Println(res.Status()) // 200 OK
}
3.2 优缺点
优点说明
模板友好可与前端、Dashboard 共用一份纯 JSON
零等待新 API 字段、Beta 特性不依赖生成器
可替换 Encoder想要 jsonitereasyjson?直接先序列化再 .Raw()
注意点说明
无校验DSL 拼写 / 字段错位不会在编译期发现
最高优先级.Raw() 覆盖一切;之后再 .Query().Request() 都被忽略

4 优雅切换策略

经验法则

  • 80 % 固定业务查询Request 结构体(静态安全)
  • 20 % 动态或实验性查询Raw JSON(灵活兜底)

在实际工程里,可将两套方案封装成 Repository / DSL Builder

type ProductRepo struct {es *typedapi.TypedClient
}func (r *ProductRepo) ByName(ctx context.Context, name string) { /* Request 结构体 */ }
func (r *ProductRepo) ByTemplate(ctx context.Context, tpl []byte) { /* Raw JSON */ }

这样调用层永远只见到 强类型方法签名,底层细节由仓库层决定,是不是很优雅?🤘

5 小结

维度Request 结构体Raw JSON
类型安全✔✔✔
IDE 补全
学习成本低(已有模板)
新字段适配需等生成器立即可用
性能自定义默认 encoding/json自选 Encoder

Typed Client 让 Go + Elasticsearch 在保持类型安全的同时,又给出了面向未来的 Raw JSON 逃生口。只需根据「查询稳定性 & 模板复用程度」做权衡,就能兼顾 可靠性灵活性,写出更易维护、更易拓展的搜索服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90978.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90978.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90978.shtml

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

相关文章

Leaflet 综合案例-聚类图层控制

看过的知识不等于学会。唯有用心总结、系统记录,并通过温故知新反复实践,才能真正掌握一二 作为一名摸爬滚打三年的前端开发,开源社区给了我饭碗,我也将所学的知识体系回馈给大家,助你少走弯路! OpenLayers…

React组件中的this指向问题

在 React 组件中,函数定义方式影响this指向的核心原因是箭头函数与普通函数的作用域绑定规则不同,具体差异如下:​ 1. 普通函数(function定义)需要手动bind(this)的原因​ 当用function在组件内定义方法时&#xff1…

Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示

在 Vue 项目中,组件间的引用与数据交互是核心功能之一。以下是组件引用和数据交互的详细实现方式及示例:一、组件引用方式 1. 基本组件引用 局部注册:在父组件中按需引入子组件并注册。 // ParentComponent.vue import ChildComponent from .…

✨ 使用 Flask 实现头像文件上传与加载功能

文章目录&#x1f9f1; 技术栈&#x1f5c2;️ 项目结构与配置&#x1f510; 用户身份校验逻辑&#x1f4e4; 头像上传接口&#xff1a;/file/avatar/upload&#x1f4e5; 加载头像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例请求&#xff08;使用 …

去除视频字幕 5: 使用 ProPainter, 记录探索过程

使用 ProPainter 去除视频上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 项目目标 去除视频 (bear.webm) 中的硬字幕。 2. 初始尝试与关键失败&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一个图像修复工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 请求:从老古董到新潮流

前端开发离不开跟后端打交道&#xff0c;HTTP 请求就是这座桥梁。JavaScript 提供了好几种方式来发请求&#xff0c;从老牌的 XMLHttpRequest (XHR) 到现代的 Fetch API&#xff0c;再到各种好用的第三方库&#xff08;像 Axios、Ky、Superagent&#xff09;。咱们一个一个聊清…

Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程

安装提示 后续安装本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默认安装&#xff0c;没有安装给出教程链接。 一、Cmake4.1.0下载 1.官网下载&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.压缩包…

【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程

一、工具作用与整体架构 1.1 各工具核心作用 工具作用描述关键特性Jmeter性能测试工具&#xff0c;模拟多用户并发请求&#xff0c;生成测试数据支持HTTP/HTTPS、数据库等多种协议&#xff0c;可自定义测试场景InfluxDB时序数据库&#xff0c;专门存储时间序列数据&#xff0…

【Kubernetes】使用Deployment进行的资源调度,资源清理,伸缩与更新管控

Kubernetes Deployment 实战&#xff1a;从资源清理到伸缩与更新管控 一、基础准备&#xff1a;清理闲置 ReplicaSet 在使用 Deployment 时&#xff0c;每次更新都会生成新的 ReplicaSet&#xff08;简称 RS&#xff09;&#xff0c;旧的 RS 会被保留但设置为 DESIRED0。这些闲…

stm32使用USB虚拟串口,因电脑缺少官方驱动而识别失败(全系列32单片机可用)

驱动下载地址 官网地址&#xff1a;https://www.st.com/en/development-tools/stsw-stm32102.html

枚举中间位置基础篇

参考资料来源灵神在力扣所发的题单&#xff0c;仅供分享学习笔记和记录&#xff0c;无商业用途。 核心思路&#xff1a; 一&#xff1a;直接直接用数据结构记录需要的数据&#xff0c;在枚举右&#xff0c;维护左的循环中&#xff0c;删除当前位置的元素即可达成一样效果 二…

企业选择将服务器放在IDC机房托管的优势

在服务器作为数据存储和传输的核心设备的社会环境中&#xff0c;服务器的稳定性和安全性会直接影响到企业业务的连续性和用户的满意程度&#xff0c;随着云计算技术和大数据的兴起&#xff0c;企业对于服务器的需求也在日益增加&#xff0c;而如何高效、安全的管理服务器则是各…

自动化UI测试工具TestComplete的AI双引擎:即时数据集 + 自愈测试

随着敏捷开发和持续交付模式的普及&#xff0c;传统的软件测试方法正面临着前所未有的挑战。测试团队在追求快速迭代的同时&#xff0c;往往陷入测试数据准备和测试维护的泥潭&#xff0c;严重制约了交付效率和质量保障能力。 TestComplete作为业界领先的自动化测试工具&#…

用KNN实现手写数字识别:基于 OpenCV 和 scikit-learn 的实战教学 (超级超级超级简单)

用KNN实现手写数字识别&#xff1a;基于 OpenCV 和 scikit-learn 的实战教学在这篇文章中&#xff0c;我们将使用 KNN&#xff08;K-Nearest Neighbors&#xff09;算法对手写数字进行分类识别。我们会用 OpenCV 读取图像并预处理数据&#xff0c;用 scikit-learn 构建并训练模…

数据结构自学Day15 -- 非比较排序--计数排序

一、计数排序&#xff08;Counting Sort&#xff09;计数排序是一种非比较型的排序算法&#xff0c;它的核心思想是&#xff1a;利用“元素的值”来确定它在结果数组中的位置&#xff0c;通过“统计每个数出现的次数”来完成排序。二、如何实现计数排序&#xff08;核心步骤&am…

k8s的权限

来自博客&#xff1a;25-k8s集群中-RBAC用户角色资源权限_权限 资源 角色-CSDN博客 一.RBAC概述&#xff08;基于角色的访问控制&#xff09; 1.图解 用户&#xff1a; 1.user 2.serviceAccount 3.Group 用户角色 1.Role:局部资源角色 2.clusterRole:全局资源角色额 角色绑…

C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(三)

目录 队列数据管理 代码实现 测试代码 绑定信息(交换机-队列)管理 代码实现 测试代码 队列数据管理 当前队列数据的管理&#xff0c;本质上是队列描述信息的管理&#xff0c;描述当前服务器上有哪些队列。 定义队列描述数据类 队列名称是否持久化标志是否独占标志是否自…

51c自动驾驶~合集9

自己的原文哦~ https://blog.51cto.com/whaosoft/11627386 #端到端1 说起端到端&#xff0c;每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点&#xff01;特斯拉率先吹响了方案更新的号角&#xff0c;无论是完全端到端&#xff0c;还是专注于planner的模…

时间长了忘记jupyter的环境是哪个了

有这些但是忘记是哪个了jupyter kernelspec list查看内核路径&#xff0c;这个内核是用来告诉jupyter 去哪找内核配置的到这个路径下打开json文件查看使用的python环境从而确定是哪个conda环境为jupyter使用的python环境jupyter的工作原理&#xff1a;在创建conda环境后会安装j…

PYTHON从入门到实践-15数据可视化

数据可视化是数据分析中不可或缺的一环&#xff0c;它能够将抽象的数据转化为直观的图形&#xff0c;帮助我们更好地理解数据特征和发现潜在规律。本文将介绍如何使用Python中的Matplotlib和Plotly库进行数据可视化&#xff0c;并通过掷骰子的概率模拟案例展示可视化的实际应用…