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、https://segmentfault.com/a/1190000039140870
2、https://pkg.go.dev/github.com/elastic/go-elasticsearch/v6@v6.8.5/esapi
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/iHIxsEZf3w06GbO2sHSuRA