「GoCN酷Go推薦」Golang的Ealstic連結庫
背景介紹
Elasticsearch是一個分散式、高擴充套件、高實時的搜尋與資料分析引擎,用於海量文件的搜尋。有些專案會將Elasticsearch當做儲存海量資料的資料庫使用,可見其查詢效能之高效。作為面向文件的搜尋引擎,Elasticsearch比起傳統資料庫更偏向於結構化資料的高效查詢,其獨特的倒排索引更能將查詢效能提升至極致。在大資料微服務時代,Elasticsearch在海量資料搜尋、資料探勘、人工智慧領域都起到了關鍵作用。
安 裝
go get "github.com/olivere/elastic/v7"
Elasticsearch的資料來源通常來自於Logstash等資料採集中介軟體,作為golang專案來說,其查詢功能的使用更加普遍。此文章以V7版本為例來介紹如何使用golang對Elasticsearch進行查詢。
開源庫的使用
連線客戶端構建
import elasticv7 "github.com/olivere/elastic/v7"
address := []string{"http://127.0.0.1:9200"}
cli, err := elasticv7.NewClient(
elasticv7.SetURL(address...),
elasticv7.SetBasicAuth("elastic", "123456"),
elasticv7.SetSniff(false),
)
-
address 為叢集的地址
-
SetBaseicAuth 接受UserName和Password作為引數完成校驗
-
Sniff引數為true,建立的客戶端會去嗅探整個叢集,此動作會使用內網IP通訊,導致無法連線到ES伺服器,這裡設定為false。
建立查詢語句
精確查詢
// 單值查詢
elasticv7.NewTermQuery("key","value")
// 多值查詢
elasticv7.NewTermsQuery("key", []string{"value1","value2"}...)
精確查詢要注意字串型別的匹配,若為text欄位,將匹配失敗。可以嘗試對"{欄位}.keyword"來進行Term查詢
萬用字元查詢
elasticv7.NewWildcardQuery(key, word)
萬用字元查詢通常用於模糊查詢,例如"*xxxx*",等價於mysql中的like "%xxxx%"。
與查詢
query := elasticv7.NewBoolQuery()
query.Must(queries ...)
與查詢使用BoolQuery的Must函式來完成,其引數是型別為query的不定引數。當所有query均為真時此條件為真,可巢狀。
或查詢
elasticv7.NewWildcardQuery("", "")
query.Should(queries ...)
與Must相似。
建立查詢服務
search := cli.Search().Index(index_name).Query(query)
index_name是ES中的索引,類比Mysql相當於表Table的概念。query為查詢物件,以上各種查詢可相互巢狀形成最終的查詢物件。
分頁
search = search.From(10)
search = search.Size(10)
這裡search中的函式都是鏈式的,可分行寫亦可整行寫。
排序
search = search.Sort(key,true)
排序的第一引數為排序欄位,第二引數為是否正序。
跳過評分計算
constantQuery := elasticv7.NewConstantScoreQuery(query)
評分會降低查詢的效率,當不需要時可以跳過。
總 結
官方庫需要自己去構造查詢的json結構,使用起來較為混亂,不易理解。相較而言,此開源庫採用鏈式可巢狀的形式來構造查詢物件,使用起來更加清晰便捷。其原始碼庫中亦有相當多的各類函式和物件用於各種條件查詢,此次只是摘取本人使用時設計過的些許功能加以介紹。
參考資料
1、http://segmentfault.com/a/1190000039140870
2、http://pkg.go.dev/github.com/elastic/go-elasticsearch/[email protected]/esapi
《酷Go推薦》招募:
各位Gopher同學,最近我們社群打算推出一個類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每週推薦一個庫或者好的專案,然後寫一點這個庫使用方法或者優點之類的,這樣可以真正的幫助到大家能夠學習到
新的庫,並且知道怎麼用。
大概規則和每日新聞類似,如果報名人多的話每個人一個月輪到一次,歡迎大家報名!戳「閱讀原文」,即可報名
掃碼也可以加入 GoCN 的大家族喲~
- 支援300 常用功能的開源GO語言工具函式庫
- Dockertest 極速搭建整合測試環境神器
- 想要輕鬆玩轉Markdown?goldmark幫你實現!
- 「GoCN酷Go推薦」OBS聯結器go-obs-websocket
- 「GoCN酷Go推薦」QQ機器人 go-cqhttp
- 「GoCN酷Go推薦」使用 cmux 實現服務端連線多路複用
- 「Go官方出品」快速掌握Go1.18新特性:工作區
- 「GoCN酷Go推薦」可獨立執行的探活工具easeprobe
- Go官方的泛型簡介
- 提速10倍GO語言開發實戰內容, 從零開始開發
- 「GoCN酷Go推薦」負載測試工具 Fortio
- 騰訊2021研發大資料:Go語言熱度首次超越C
- Go1.18泛型程式設計體驗
- 「GoCN酷Go推薦」go-containerregistry 實戰篇之容器映象下載
- 「GoCN酷Go推薦」萬能的物件拷貝工具——Copier
- 「GoCN酷Go推薦」快速啟動一個管理平臺專案 GIN-VUE-ADMIN
- 監控的自我修養,過去十年和未來十年
- 「GoCN酷Go推薦」情人節別人都有 rose?別擔心,今天你有 rosedb
- 「GoCN酷Go推薦」強大的字元表格生成器 tablewriter
- 「GoCN酷Go推薦」執行時替換 Golang 函式 — gohook