首頁  >  文章  >  後端開發  >  聊聊Go語言查詢Elasticsearch關知識

聊聊Go語言查詢Elasticsearch關知識

PHPz
PHPz原創
2023-04-10 14:18:45971瀏覽

Elasticsearch 是一個開源的分散式搜尋引擎,廣泛應用於各種搜尋和資料分析場景。同時,Go語言作為一種高效且便捷的程式語言,也受到越來越多的開發者的喜愛與使用。針對 Elasticsearch 的高效能查詢和資料分析功能,Go 也提供了一些方便的查詢庫和框架。本文將對 Go 語言查詢 Elasticsearch 的相關知識進行詳細介紹,幫助大家更能實現 Elasticsearch 查詢。

一、Go語言庫介紹

Go 語言中已有了一些成熟的 Elasticsearch 查詢庫,以下根據各自的特點簡要介紹它們。

  1. go-elasticsearch

go-elasticsearch 是官方 Elasticsearch 推出的一個由 Go 語言實現的 Elasticsearch 用戶端,同時也包含 Elasticsearch 的查詢和分析功能。尤其在 Elasticsearch 7.x 版本之後,go-elasticsearch 已經成為了 Elasticsearch 官方推薦的 Go 語言庫。 go-elasticsearch 可以運行在多個作業系統平台上,並且已經支援了 Elasticsearch 6.x 以及 7.x 版本。它的具體使用方式可以參考官方文件。

  1. go-es

go-es 是小米公司開源的Elasticsearch Go 用戶端,由於其簡便易用、功能全面,已經成為國內大型在互聯網企業中廣泛應用的Elasticsearch 客戶端庫之一。 go-es 函式庫中的各種查詢 API 的參數設計簡單明了,而且語法與 Elasticsearch 的查詢語法十分接近,因此可以直接使用 Elasticsearch 查詢 DSL 進行查詢。關於該庫的詳細使用方式,可以參考其 Github 倉庫。

  1. kingim/goes

goes 是簡單易用的 Elasticsearch Go 用戶端程式庫。它大大減少了 Elasticsearch 基礎操作的學習成本,並支援介面和物件兩種使用方式。除了查詢和分析功能,goes 還提供了一個簡單的地理座標計算庫,支援計算兩個經緯度之間的距離和角度值。關於 kingim/goes 的詳細使用方式,可以參考其 Github 倉庫。

  1. olivere/elastic

olivere/elastic 是 Elasticsearch 的 Go 用戶端程式庫。類似於 go-elasticsearch 和 go-es,它們都為 Elasticsearch 提供了非常方便的查詢 API。但 olivere/elastic 更重視查詢結果的序列化和反序列化,支援多種輸出格式(如Json、Xml等)的封裝、篩選,適用於前後端結果互動等場景。您可以查看 olivere/elastic 的 Github 倉庫以取得更多使用細節。

二、查詢 Elasticsearch

在 Go 語言中,透過 Elasticsearch Go 用戶端程式庫,可以非常方便地進行 Elasticsearch 相關的查詢、搜尋和分析操作。從介面呼叫來看,各個函式庫的使用方法有些差異,但是基本的查詢功能、語法和邏輯大同小異。以下我們舉幾個例子,介紹 Go 如何查詢 Elasticsearch。

  1. 查詢所有文件

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)
    }
  1. 查詢包含某個字的文件

     q := elastic.NewTermQuery("content", "hello")
     searchResult, err := client.Search().
         Index("twitter").
         Query(q).
         Do(ctx)
     if err != nil {
         log.Fatalln(err)
     }
  2. 查詢一定範圍內的文件

     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)
     }
  3. #使用聚合函數實作分類統計

     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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn