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),
)

創建查詢語句

精確查詢

// 單值查詢
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