Elasticsearch 是一個開源的分散式搜尋引擎,廣泛應用於各種搜尋和資料分析場景。同時,Go語言作為一種高效且便捷的程式語言,也受到越來越多的開發者的喜愛與使用。針對 Elasticsearch 的高效能查詢和資料分析功能,Go 也提供了一些方便的查詢庫和框架。本文將對 Go 語言查詢 Elasticsearch 的相關知識進行詳細介紹,幫助大家更能實現 Elasticsearch 查詢。
一、Go語言庫介紹
Go 語言中已有了一些成熟的 Elasticsearch 查詢庫,以下根據各自的特點簡要介紹它們。
go-elasticsearch 是官方 Elasticsearch 推出的一個由 Go 語言實現的 Elasticsearch 用戶端,同時也包含 Elasticsearch 的查詢和分析功能。尤其在 Elasticsearch 7.x 版本之後,go-elasticsearch 已經成為了 Elasticsearch 官方推薦的 Go 語言庫。 go-elasticsearch 可以運行在多個作業系統平台上,並且已經支援了 Elasticsearch 6.x 以及 7.x 版本。它的具體使用方式可以參考官方文件。
go-es 是小米公司開源的Elasticsearch Go 用戶端,由於其簡便易用、功能全面,已經成為國內大型在互聯網企業中廣泛應用的Elasticsearch 客戶端庫之一。 go-es 函式庫中的各種查詢 API 的參數設計簡單明了,而且語法與 Elasticsearch 的查詢語法十分接近,因此可以直接使用 Elasticsearch 查詢 DSL 進行查詢。關於該庫的詳細使用方式,可以參考其 Github 倉庫。
goes 是簡單易用的 Elasticsearch Go 用戶端程式庫。它大大減少了 Elasticsearch 基礎操作的學習成本,並支援介面和物件兩種使用方式。除了查詢和分析功能,goes 還提供了一個簡單的地理座標計算庫,支援計算兩個經緯度之間的距離和角度值。關於 kingim/goes 的詳細使用方式,可以參考其 Github 倉庫。
olivere/elastic 是 Elasticsearch 的 Go 用戶端程式庫。類似於 go-elasticsearch 和 go-es,它們都為 Elasticsearch 提供了非常方便的查詢 API。但 olivere/elastic 更重視查詢結果的序列化和反序列化,支援多種輸出格式(如Json、Xml等)的封裝、篩選,適用於前後端結果互動等場景。您可以查看 olivere/elastic 的 Github 倉庫以取得更多使用細節。
二、查詢 Elasticsearch
在 Go 語言中,透過 Elasticsearch Go 用戶端程式庫,可以非常方便地進行 Elasticsearch 相關的查詢、搜尋和分析操作。從介面呼叫來看,各個函式庫的使用方法有些差異,但是基本的查詢功能、語法和邏輯大同小異。以下我們舉幾個例子,介紹 Go 如何查詢 Elasticsearch。
es 官方文件推薦使用以下方式:
Package main import ( "context" "fmt" "github.com/elastic/go-elasticsearch/v7" "github.com/elastic/go-elasticsearch/v7/esapi" "github.com/elastic/go-elasticsearch/v7/esutil" ) func main() { es, _ := elasticsearch.NewDefaultClient() req := esapi.SearchRequest{ Body: esutil.NewJSONReader(map[string]interface{}{"query": map[string]interface{}{"match_all": map[string]interface{}{}}}), Index: []string{"my-index-000001"}, TrackTotalHits: true, } res, err := req.Do(context.Background(), es) fmt.Println(res, err) }
查詢包含某個字的文件
q := elastic.NewTermQuery("content", "hello") searchResult, err := client.Search(). Index("twitter"). Query(q). Do(ctx) if err != nil { log.Fatalln(err) }
查詢一定範圍內的文件
terms := []string{"world", "how", "are", "you"} q1 := elastic.NewTermsQuery("content", terms...) q2 := elastic.NewRangeQuery("publish_time").Gte("2021-01-01").Lte("2021-02-01") query := elastic.NewBoolQuery().Must(q1).Filter(q2) searchResult, err := client.Search(). Index("twitter"). Query(query). From(0).Size(10). Do(ctx) if err != nil { log.Fatalln(err) }
#使用聚合函數實作分類統計
agg := elastic.NewTermsAggregation().Field("category").Size(10000) query := elastic.NewMatchAllQuery() searchResult, err := client.Search().Index("goods").Size(0).Query(query).Aggregation("by_category", agg).Do(ctx) if err != nil { log.Fatalln(err) } bucketDateHists := searchResult.Aggregations.Terms("by_category") for _, bucket := range bucketDateHists.Buckets { fmt.Printf("%v: %d\n", bucket.Key, int(bucket.DocCount)) }
三、總結
透過上述介紹,我們可以看到,Go 語言提供的Elasticsearch 查詢庫非常豐富,操作起來也非常簡單、有效率。無論是在資料搜尋還是資料分析,Go 語言都可以勝任其中的重要角色。當然,如果您想要更深入地了解 Elasticsearch 或 Go 語言的相關知識,建議多閱讀官方文件和原始碼,加深自己的理解和認識。
以上是聊聊Go語言查詢Elasticsearch關知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!