Go 操作 ElasticSearch 實戰

【導讀】本文介紹了 go 操作 elasticsearch 的實踐。

在這裏記錄一下 Golang 操作elastic的使用方式,本文使用的是第三方包github.com/olivere/elasticv7版本。

1. 精確匹配單個字段

使用term查詢,

package main

import (
    "context"
    "fmt"
    "github.com/olivere/elastic/v7"
    "log"
    "os"
    "reflect"
    "time"
)

type Article struct {
    Title   string    // 文章標題
    Content string    // 文章內容
    Author  string    // 作者
    Created time.Time // 發佈時間
}


func main() {
        // 創建Client, 連接ES
    client, err := elastic.NewClient(
        // elasticsearch 服務地址,多個服務地址使用逗號分隔
        elastic.SetURL("http://127.0.0.1:9200", "http://127.0.0.1:9201"),
        // 基於http base auth驗證機制的賬號和密碼
        elastic.SetBasicAuth("user", "secret"),
        // 啓用gzip壓縮
        elastic.SetGzip(true),
        // 設置監控檢查時間間隔
        elastic.SetHealthcheckInterval(10*time.Second),
        // 設置請求失敗最大重試次數
        elastic.SetMaxRetries(5),
        // 設置錯誤日誌輸出
        elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
        // 設置info日誌輸出
        elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))

    if err != nil {
        // Handle error
        fmt.Printf("連接失敗: %v\n", err)
    } else {
        fmt.Println("連接成功")
    }

    // 執行ES請求需要提供一個上下文對象
    ctx := context.Background()

    // 創建term查詢條件,用於精確查詢
    termQuery := elastic.NewTermQuery("Author", "tizi")

    searchResult, err := client.Search().
        Index("blogs").   // 設置索引名
        Query(termQuery).   // 設置查詢條件
        Sort("Created", true). // 設置排序字段,根據Created字段升序排序,第二個參數false表示逆序
        From(0). // 設置分頁參數 - 起始偏移量,從第0行記錄開始
        Size(10).   // 設置分頁參數 - 每頁大小
        Pretty(true).       // 查詢結果返回可讀性較好的JSON格式
        Do(ctx)             // 執行請求

    if err != nil {
        // Handle error
        panic(err)
    }

    fmt.Printf("查詢消耗時間 %d ms, 結果總數: %d\n", searchResult.TookInMillis, searchResult.TotalHits())


    if searchResult.TotalHits() > 0 {
        // 查詢結果不爲空,則遍歷結果
        var b1 Article
        // 通過Each方法,將es結果的json結構轉換成struct對象
        for _, item := range searchResult.Each(reflect.TypeOf(b1)) {
            // 轉換成Article對象
            if t, ok := item.(Article); ok {
                fmt.Println(t.Title)
            }
        }
    }
}

後續示例只列舉出核心代碼,其餘代碼結構參考本節實現。

2. 通過 terms 實現 SQL 的 in 查詢

// 創建terms查詢條件
termsQuery := elastic.NewTermsQuery("Author", "tizi", "tizi365")

searchResult, err := client.Search().
        Index("blogs").   // 設置索引名
        Query(termsQuery).   // 設置查詢條件
        Sort("Created", true). // 設置排序字段,根據Created字段升序排序,第二個參數false表示逆序
        From(0). // 設置分頁參數 - 起始偏移量,從第0行記錄開始
        Size(10).   // 設置分頁參數 - 每頁大小
        Do(ctx)             // 執行請求

3. 匹配單個字段

某個字段使用全文搜索

// 創建match查詢條件
matchQuery := elastic.NewMatchQuery("Title", "golang es教程")

searchResult, err := client.Search().
        Index("blogs").   // 設置索引名
        Query(matchQuery).   // 設置查詢條件
        Sort("Created", true). // 設置排序字段,根據Created字段升序排序,第二個參數false表示逆序
        From(0). // 設置分頁參數 - 起始偏移量,從第0行記錄開始
        Size(10).   // 設置分頁參數 - 每頁大小
        Do(ctx)

4. 範圍查詢

實現類似 Created > '2020-07-20' and Created < '2020-07-22'的範圍查詢條件

// 例1 等價表達式:Created > "2020-07-20" and Created < "2020-07-29"
rangeQuery := elastic.NewRangeQuery("Created").
        Gt("2020-07-20").
        Lt("2020-07-29")

// 例2 等價表達式:id >= 1 and id < 10
rangeQuery := elastic.NewRangeQuery("id").
        Gte(1).
        Lte(10)

5.bool 組合查詢

bool的功能類似於 Sql 中的andor,將查詢條件組合起來。

5.1. must 條件

must類似sql中的and功能,

// 創建bool查詢
boolQuery := elastic.NewBoolQuery().Must()

// 創建term查詢
termQuery := elastic.NewTermQuery("Author", "tizi")
matchQuery := elastic.NewMatchQuery("Title", "golang es教程")

// 設置bool查詢的must條件, 組合了兩個子查詢
// 表示搜索匹配Author=tizi且Title匹配"golang es教程"的文檔
boolQuery.Must(termQuery, matchQuery)

searchResult, err := client.Search().
        Index("blogs").   // 設置索引名
        Query(boolQuery).   // 設置查詢條件
        Sort("Created", true). // 設置排序字段,根據Created字段升序排序,第二個參數false表示逆序
        From(0). // 設置分頁參數 - 起始偏移量,從第0行記錄開始
        Size(10).   // 設置分頁參數 - 每頁大小
        Do(ctx)             // 執行請求

5.2. must_not 條件

跟 must 的作用相反,用法和 must 類似

// 創建bool查詢
boolQuery := elastic.NewBoolQuery().Must()

// 創建term查詢
termQuery := elastic.NewTermQuery("Author", "tizi")

// 設置bool查詢的must not條件
boolQuery.MustNot(termQuery)

5.3. should 條件

類似 SQL 中的 or, 只要匹配其中一個條件即可。

// 創建bool查詢
boolQuery := elastic.NewBoolQuery().Must()

// 創建term查詢
termQuery := elastic.NewTermQuery("Author", "tizi")
matchQuery := elastic.NewMatchQuery("Title", "golang es教程")

// 設置bool查詢的should條件, 組合了兩個子查詢
// 表示搜索Author=tizi或者Title匹配"golang es教程"的文檔
boolQuery.Should(termQuery, matchQuery)

以上,使用簡明扼要的方式來說明在 Go 語言中使用 ES 查詢的方式,包括精確查詢,全文索引,範圍查詢,組合查詢等,希望能夠對大家有用。

轉自: juejin.cn/post/6978782173306290184

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/4mBFcCNZarFf7-c3fffPOQ