Go 操作 ElasticSearch 實戰
【導讀】本文介紹了 go 操作 elasticsearch 的實踐。
在這裏記錄一下 Golang 操作elastic
的使用方式,本文使用的是第三方包github.com/olivere/elastic
的v7
版本。
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 中的and
和or
,將查詢條件組合起來。
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