Elasticsearch Go 客户端

告别手写 ES DSL 的噩梦!我开源了一个像 GORM 一样丝滑的 Elasticsearch Go 客户端 🚀

大家好!在用 Go 语言对接 Elasticsearch 时,你是否也曾被层层嵌套的 map[string]any 或是冗长生硬的 JSON 字符串折磨过?

为了解决这些痛点,我开发并开源了 go-es ------ 一个专为 Gopher 打造的、支持优雅链式调用的 Elasticsearch 客户端库。

🔗 GitHub 仓库地址 :github.com/Kirby980/go... (求个 Star ⭐)


😫 我们为什么需要一个新的 ES 客户端?

在日常开发中,使用官方的 go-elasticsearch 客户端时,你可能经常遇到这样的场景:

【原生客户端痛点】

  1. 类型不安全 :充斥着各种 map[string]any 嵌套,写错一个 key 或者层级,只有到运行时 ES 报错了才知道。
  2. 长串 JSON 字符串 :手写大量的 JSON 字符串(比如 bytes.NewReader([]byte({"query": ...}))),一旦有动态参数,拼接字符串会让人崩溃。
  3. 心智负担重:对于常见的高阶功能(如深度分页 Scroll/Search After、Bulk 批量操作),每次都要去查阅长长的官方 API 文档,自己组装繁杂的 Request。

✨ go-es 的核心亮点

go-es 并不是去替代底层的网络请求,而是提供了一套 高度语义化、类型安全且极其优雅的 API 封装,让你像写 GORM 操作数据库一样操作 ES:

1. 丝滑的链式查询 (Builder 模式)

完全摒弃原始 JSON,各种条件组合信手拈来。

go 复制代码
resp, err := builder.NewSearchBuilder(esClient, "articles").
    Term("status", 1).                       // 精确匹配
    Should(func(b *builder.SearchBuilder) {  // 复杂的 bool 嵌套查询
        b.MatchShould("title", "golang").
          TermsShouldBoost("tags", 2.0, "go", "es") // 支持直接设置 boost 权重
    }).
    From(0).Size(10).                        // 分页
    Sort("created_at", "desc").              // 排序
    Do(ctx)

// 告别手动解析,一键 Scan 到结构体切片!
var articles []Article
resp.Scan(&articles)

2. GORM 风格的增删改查 (Sugar 扩展)

如果你甚至不想用 Builder,只想用结构体做最基础的 CRUD,go-es/sugar 直接满足你:

go 复制代码
s := sugar.New(esClient)

// 自动根据 Struct Tag (es:"type:text;analyzer:ik_smart") 建表/更新 Mapping!
s.AutoMigrate(&Article{}) 

// 一行代码创建/更新文档
s.Upsert(ctx, "article-1", &Article{Title: "Hello go-es", Status: 1})

3. 生产级的高可用支持

go-es 不仅仅是包了一层语法糖,它内置了完善的容灾与调度机制:

  • 节点嗅探 (Sniff):动态感知 ES 集群节点变化,无缝适配扩缩容。
  • 故障转移与熔断 (Circuit Breaker):某节点宕机自动切走请求,避免雪崩。
  • 指数退避重试 (Exponential Backoff):遭遇 429 降级或网络抖动时,优雅地执行退避重试。
  • 连接池优化:内置 Gzip 压缩开关、连接数精细化配置。

4. 覆盖 99% 的核心与进阶操作

  • 表结构管理 (IndexBuilder)
  • 高性能批量写入 (BulkBuilder 内置 MapPool 零反射优化)
  • 各种深度分页 (ScrollBuilder, SearchAfterBuilder)
  • 聚合分析 (AggregationBuilder)
  • 各类集群运维操作 (ILM, Rollover, Snapshot, EQL, SQL 等等)
  • 原生 DSL 兜底 :随时可以通过 RawQuery 直接注入你手写的任意原生 DSL,灵活性不打折!

🛠️ 快速上手

安装:

bash 复制代码
go get github.com/Kirby980/go-es

初始化连接:

go 复制代码
esClient, err := client.New(
    config.WithAddresses("http://localhost:9200", "http://localhost:9201"), // 支持多地址轮询
    config.WithAuth("elastic", "password"),
    config.WithCircuitBreaker(true, 3, 10*time.Second, 5*time.Second),      // 开启熔断器
    config.WithSniff(true, 5*time.Minute),                                  // 开启节点嗅探
)

🤝 欢迎试用与交流

不管你是在做简单的日志检索,还是复杂的电商商品筛选,go-es 都能帮你极大地节省拼接和调试 DSL 的时间。

项目完全开源,文档注释非常齐全(每一个导出的 API 都有标准的 Go Doc,且 README 包含大量常见场景的范例)。

如果你的团队正好在用 Go + ES,不妨试试 go-es!如果它帮助到了你,欢迎在 GitHub 上点个 Star 支持一下开源作者!

🔗 仓库直通车 :github.com/Kirby980/go...

有任何需求建议或者 Bug,随时欢迎提 Issue/PR 交流探讨!

相关推荐
明月_清风8 分钟前
面对陌生的 GitHub 项目无从下手?这 4 个网站帮你快速读懂源码
前端·后端·github
bug菌28 分钟前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端
leobertlan33 分钟前
痛苦系列 | DSP-02 频域切片:DTFT与DFT的探索
android·后端
加我攻城狮1 小时前
当大模型把「景区」定位到附近公共厕所:我的 AI 旅行小程序踩坑实录
后端·微信
Lonely丶墨轩1 小时前
用 Vue + Spring Boot + Python 做一个 AI 双人海龟汤游戏:从出题、联机到自动审稿等核心技术设计与实现
spring boot·后端·游戏
猪猪拆迁队1 小时前
跨电脑复制共享-WebRTC 打洞踩坑
前端·后端·go
ServBay1 小时前
如何用 AI Agent 构建全栈应用(2026版)
后端·ai编程
黎燃2 小时前
我给自己写了一个 mini OpenRouter:基于蓝耘 MaaS 的多模型路由网关实战
后端
leobertlan2 小时前
痛苦系列 | DSP-01 从连续到离散:DSP基础与采样
android·后端
高频因子挖掘机2 小时前
同一只股票前复权和不复权价格对不上?先检查这几个口径
后端·github·api