用 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
英文地址,請注明出處:http://en.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…