Golang 的 Elastic 連結庫
Golang 的 Elastic 連結庫
背景介紹
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)
評分會降低查詢的效率,當不需要時可以跳過。
與 Sql 的轉換
select * from t where a = 1 and b = 2;
elasticv7.NewBoolQuery().Must(elasticv7.NewTermQuery("a", 1), elasticv7.NewTermQuery("b", 2))
select * from t where a = 1 or a = 2;
elasticv7.NewBoolQuery().Must(elasticv7.NewTermsQuery("a", 1, 2))
select * from t where a = 1 or b = 2;
elasticv7.NewBoolQuery().Should(elasticv7.NewTermQuery("a", 1), elasticv7.NewTermQuery("b", 2))
select * from t where a like '%m%' and b like '%n%';
elasticv7.NewBoolQuery().Must(elasticv7.NewWildcardQuery("a", "*m*"), elasticv7.NewWildcardQuery("b", "*n*"))
select name,age from t;
cli.Search().Index("t").Source([]string{"name","age"})
select * from t limit 2 offset 1;
cli.Search().Index("t").From(1).Size(2)
獲取查詢結果
使用 Each 獲得結果,型別為 [] interface{},再使用斷言得到所需的結構體。
var user User
result := cli.Search().Index("t").Do(context.Background())
users := result.Each(reflect.TypeOf(user))
for _,v := range users {
u , ok := v.(User)
}
總結
官方庫需要自己去構造查詢的 json 結構,使用起來較為混亂,不易理解。相較而言,此開源庫採用鏈式可巢狀的形式來構造查詢物件,使用起來更加清晰便捷。其原始碼庫中亦有相當多的各類函式和物件用於各種條件查詢,此次只是摘取本人使用時設計過的些許功能加以介紹。
參考資料
1、https://segmentfault.com/a/1190000039140870
2、https://pkg.go.dev/github.com/elastic/go-elasticsearch/v6@v6.8.5/esapi
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 【連結 1】與靜態連結庫連結
- 動態連結庫與靜態連結庫
- cmake 連結動態連結庫
- golang 實現連結串列爽不爽?Golang
- gcc庫連結GC
- golang的比較好的一些超連結Golang
- Golang 全域性sql資料庫連線GolangSQL資料庫
- golang連線達夢資料庫的一個坑Golang資料庫
- golang二級指標操作連結串列Golang指標
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- golang開發:類庫篇(二) Redis連線池的使用GolangRedis
- Golang從合併連結串列聊遞迴Golang遞迴
- php連結資料庫PHP資料庫
- JDBC連結資料庫JDBC資料庫
- golang兩種資料庫連線池實現Golang資料庫
- 5分鐘搞懂 Golang 資料庫連線管理Golang資料庫
- Linux環境下:程式的連結, 裝載和庫[靜態連結]Linux
- golang中的log庫Golang
- jmeter連結mysql資料庫JMeterMySql資料庫
- 解密MSSQL連結資料庫的密碼解密SQL資料庫密碼
- 動態連結庫的生成和使用(二)
- 動態連結庫(DLL)的建立和使用
- [Golang]力扣LeetBook—初級演算法—連結串列—迴文連結串列(快慢指標)Golang力扣演算法指標
- elastic-job-lite 資料結構分析AST資料結構
- 易語言連結資料庫資料庫
- git 本機連結多庫配置Git
- PostgreSQL:資料庫連結測試SQL資料庫
- golang 快速入門 [5.1]-go 語言是如何執行的-連結器Golang
- 教你如何運用python/golang實現迴圈連結串列PythonGolang
- Golang | IO庫Golang
- Golang 針對 MySQL 資料庫表結構的差異 SQL 工具GolangMySql資料庫
- 理解Golang的Time結構Golang
- golang連線MySQL時候的連線池設定GolangMySql
- Elastic APMAST
- Jmeter 連結資料庫後批次使用的問題JMeter資料庫
- 使用Navicat Premium 連結本地資料庫的方法(二)REM資料庫
- SparkR連結mysql資料庫(踩坑)SparkMySql資料庫
- python環境連結Oracle資料庫PythonOracle資料庫