首頁 > 後端開發 > Golang > 在Go語言中使用Elasticsearch實現高效的搜索

在Go語言中使用Elasticsearch實現高效的搜索

王林
發布: 2023-06-15 21:01:40
原創
2067 人瀏覽過

隨著大數據時代的到來,資料的儲存和檢索已經成為了我們面臨的一個重要問題。 Elasticsearch 是一個開源的分散式即時搜尋和分析引擎,它可以透過快速反向索引來搜尋大量的數據,提供了高效的全文搜尋、聚合分析、即時監控、自動補全和數據視覺化等功能,在實際的應用場景中有著廣泛的應用。同時,Go語言作為一門快速、靜態類型的程式語言,也廣泛應用於後端服務開發。在本文中,我們將介紹如何在Go語言中使用 Elasticsearch 實現高效的搜尋功能。

一、安裝Elasticsearch和Go函式庫
首先,我們需要安裝 Elasticsearch 和對應的 Go 函式庫來實現 Go 對 Elasticsearch 用戶端的支援。對於 Elasticsearch 的安裝,可以前往 Elasticsearch 的官網(https://www.elastic.co/downloads/elasticsearch)下載對應版本的安裝包,根據作業系統和安裝方式進行安裝。

接著,我們需要在 Go 環境中新增 Elasticsearch 的客戶端程式庫。在 Go 中,有許多第三方函式庫支援我們使用 Elasticsearch 用戶端進行程式設計開發。其中,比較常見的函式庫有:

  1. Elastic(文件位址:https://godoc.org/gopkg.in/olivere/elastic.v5)
  2. go-elasticsearch(文件網址:https://github.com/elastic/go-elasticsearch)
  3. golang-elasticsearch(文件位址:https://github.com/elastic/go-elasticsearch)

這裡我們選用Elastic。在Go 中,可以使用下列指令來安裝Elasticsearch 的客戶端程式庫:

go get -u gopkg.in/olivere/elastic.v5

二、連接Elasticsearch
連接Elasticsearch需要指定Elasticsearch 伺服器的IP 和連接埠號,預設情況下Elasticsearch 的連接埠號碼是9200,可以透過以下方法來實現連接:

client, err := elastic.NewClient(

elastic.SetURL("http://127.0.0.1:9200"),
elastic.SetSniff(false),
登入後複製

)
if err != nil {

// do something...
登入後複製
登入後複製

}

在建立Elasticsearch 客戶端時,也可以進行一些自訂設置,如下面的程式碼:

# client, err := elastic.NewClient(

elastic.SetURL("http://127.0.0.1:9200"),
elastic.SetSniff(false),
elastic.SetHealthcheck(true),
elastic.SetGzip(true),
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)),
elastic.SetTraceLog(log.New(ioutil.Discard, "", 0)),
登入後複製

)

#其中,對於連接Elasticsearch 的設置,我們分別進行了以下配置:

  1. #SetURL()方法用於指定Elasticsearch 伺服器的IP 和連接埠號碼;
  2. SetSniff() 方法用來禁止Elastic 在運行時自動發現其他節點的狀態以獲得叢集健康狀態等資訊;
  3. SetHealthcheck () 方法用來指定健康狀態偵測的頻率,如果偵測到例外情況則會傳送通知;
  4. SetGzip() 方法用來開啟Elasticsearch 用戶端的Gzip 壓縮功能;
  5. SetErrorLog()方法用來指定錯誤日誌資訊;
  6. SetInfoLog() 方法用來指定提示資訊;
  7. SetTraceLog() 方法用來指定追蹤日誌資訊。

三、基礎查詢
在連接 Elasticsearch 之後,我們可以對其中的資料進行基礎查詢。以下是一個簡單的查詢範例:

query := elastic.NewMatchQuery("name", "John")
result, err := client.Search().

Index("users").
Query(query).
Do(context.Background())
登入後複製

if err != nil {

// do something...
登入後複製
登入後複製

}
fmt.Printf("Query took %d milliseconds
", result.TookInMillis)

其中,我們使用了elastic 套件中的NewMatcQuery() 方法來建立一個精確比對查詢,查詢欄位為name,查詢條件為"John"。在執行查詢時,我們將查詢的索引設定為 users,並指定了查詢的方法,這裡我們使用了 client.Search() 來執行查詢操作。最後,我們透過 result.TookInMillis 方法來取得查詢所消耗的時間。

四、進階查詢
在實際的使用中,我們需要實作更複雜的查詢功能,例如範圍查詢、模糊查詢、排序等。 Elasticsearch 支援透過 Query DSL(查詢領域特定語言)來實作這些功能。以下是一些常見的查詢方式範例:

  1. 全文查詢

query := elastic.NewMatchQuery("content", "Elasticsearch")

  1. #多重條件匹配查詢

boolQuery := elastic.NewBool​​Query().Must(

elastic.NewMatchQuery("content", "Elasticsearch"),
elastic.NewRangeQuery("age").Gt("20"),
登入後複製

)

    ##範圍查詢
rangeQuery := elastic.NewRangeQuery("age").Gt("20").Lt("30")

    模糊查詢
fuzzyQuery := elastic.NewFuzzyQuery("content", "Elasticsearch").

Fuzziness(2).
PrefixLength(1)
登入後複製

    排序
sort := elastic.NewFieldSort("age").Asc( )

searchResult, err := client.Search().

Index("users").
Query(boolQuery).
SortBy(sort).
Do(context.Background())
登入後複製

#當然,在實際的使用中,我們將會使用更複雜和靈活的查詢方式來取得我們需要的資料。

五、分頁和聚合

在進行資料查詢時,我們經常需要對資料進行分頁顯示以及進行聚合查詢。 Elasticsearch 也提供了支援這些操作的查詢方式。以下是一些常見的查詢方式範例:

    分頁查詢
searchResult, err := client.Search().

Index("users").
Query(boolQuery).
From(0).Size(10).
Do(context.Background())
登入後複製

其中,From () 方法用於設定查詢起始位置, Size() 方法用於設定傳回的資料條數。

  1. 聚合查询

ageAggs := elastic.NewTermsAggregation().Field("age")
searchResult, err := client.Search().

Index("users").
Query(boolQuery).
Aggregation("age_group", ageAggs).
Do(context.Background())
登入後複製

其中,我们使用了 Elastic 中的 NewTermsAggregation() 方法和 Aggregation() 方法来创建聚合查询。在这个示例中,我们以 "age" 字段作为聚合查询的依据。

六、总结
在本文中,我们介绍了如何在 Go 语言中使用 Elasticsearch 构建一个高效的搜索系统。从连接 Elasticsearch 开始,我们讲解了基础查询、进阶查询、分页和聚合查询等多种查询方式,以及如何使用 Elasticsearch 去提高我们的搜索效率,并给出了部分示例代码。通过阅读本文,您应该可以对 Go 和 Elasticsearch 之间的集成有一个更加深入的理解,应用于实际项目开发中去构建高效的搜索系统。

以上是在Go語言中使用Elasticsearch實現高效的搜索的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板