Go-Elasticsearch Typed Client查詢請求的兩種寫法強類型 Request 與 Raw JSON

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;并通過擲骰子的概率模擬案例展示可視化的實際應用…