golang查詢elasticsearch初體驗

庫選擇

golang查詢es目前有兩個庫,一個是第三方的github.com/olivere/elastic仍翰,一個是官方的github.com/elastic/go-elasticsearch,根據(jù)以往被坑的經驗,果斷選擇使用官方庫

查詢語法

這個只能看文檔了谎亩,推薦官方文檔,還是比較好懂的https://www.elastic.co/guide/cn/elasticsearch/guide/current/query-dsl-intro.html
研究了半天最后寫的表達式如下

{
  "query": {
    "match": {
      "log": {
        "query": "qweasd1 10.0.11.129 注冊了系統(tǒng)",
        "operator": "and"
      }
    }
  }
}

放到kibana中測試一下宇姚,符合預期


WX20210126-181745

編寫代碼

func search(c *gin.Context) {
    var (
        r map[string]interface{}
    )
    type SearchInfo struct {
        Word string `json:"word"`
    }
    var info SearchInfo
    if err := c.ShouldBindJSON(&info); err != nil {
        c.JSON(http.StatusOK, gin.H{"code": 1001, "message": err.Error()})
        return
    }
    var buf bytes.Buffer
    query := map[string]interface{}{
        "query": map[string]interface{}{
            "match_phrase": map[string]interface{}{
                "log":      info.Word,
                "operator": "and",
            },
        },
    }
    if err := json.NewEncoder(&buf).Encode(query); err != nil {
        log.Printf("Error encoding query: %s", err)
    }
    res, err := es.Search(
        es.Search.WithContext(context.Background()),
        es.Search.WithIndex("logs"),
        es.Search.WithBody(&buf),
        es.Search.WithTrackTotalHits(true),
        es.Search.WithPretty(),
    )
    if err != nil {
        log.Printf("Error getting response: %s", err)
        c.JSON(http.StatusOK, gin.H{"code": 1003, "message": err.Error()})
        return
    }
    defer res.Body.Close()

    if res.IsError() {
        var e map[string]interface{}
        if err := json.NewDecoder(res.Body).Decode(&e); err != nil {
            log.Fatalf("Error parsing the response body: %s", err)
        } else {
            // Print the response status and error information.
            log.Printf("[%s] %s: %s",
                res.Status(),
                e["error"].(map[string]interface{})["type"],
                e["error"].(map[string]interface{})["reason"],
            )
        }
    }
    if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
        log.Printf("Error parsing the response body: %s", err)
    }
    // Print the response status, number of results, and request duration.
    log.Printf(
        "[%s] %d hits; took: %dms",
        res.Status(),
        int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64)),
        int(r["took"].(float64)),
    )
    // Print the ID and document source for each hit.
    for _, hit := range r["hits"].(map[string]interface{})["hits"].([]interface{}) {
        log.Printf(" * ID=%s, %s", hit.(map[string]interface{})["_id"], hit.(map[string]interface{})["_source"])
    }

    log.Println(strings.Repeat("=", 37))
    c.JSON(http.StatusOK, gin.H{"code": 0, "message": "OK"})
}

坑來了

2021/01/26 18:03:45 [400 Bad Request] parsing_exception: [match_phrase] query doesn't support multiple fields, found [log] and [operator]

這個庫這種語法貌似不支持匈庭,換

query := map[string]interface{}{
        "query": map[string]interface{}{
            "bool": map[string]interface{}{
                "must": []interface{}{
                    map[string]interface{}{
                        "match_phrase": map[string]string{
                            "log": info.IP,
                        },
                    },
                    map[string]interface{}{
                        "match_phrase": map[string]string{
                            "log": info.UserName,
                        },
                    },
                    map[string]interface{}{
                        "match_phrase": map[string]string{
                            "log": info.Content,
                        },
                    },
                },
            },
        },
    }

每當這個時候,就無比懷念PHP的好

結果

2021/01/26 18:52:48 [200 OK] 1 hits; took: 362ms
2021/01/26 18:52:48  * ID=swyLPHcBVf2j-S8W5N2N, map[@timestamp:2021-01-26T02:35:08.178869714+00:00 docker:map[container_id:58e018a3bb44d1788aa1f8c7ae29708e224555cce714b18d30bc7ac3d56fe32c] kubernetes:map[container_image:cp-user-server:1.0.3 container_image_id:docker://sha256:015cc14bdab277d818775fb9fa1094f2d4056c65a91e355a8519713c7b2d9234 container_name:user host:hp labels:map[app:user pod-template-hash:868b789497] master_url:https://10.96.0.1:443/api namespace_id:598874aa-157d-46ad-a04a-2a069765a395 namespace_name:default pod_id:9b0242e2-e4fb-419a-a6aa-be6c0c6b3970 pod_name:user-868b789497-gsbsn] log:2021-01-26 10:35:08.178183 qweasd1 10.0.11.129 注冊了系統(tǒng)
 stream:stdout tag:kubernetes.var.log.containers.user-868b789497-gsbsn_default_user-58e018a3bb44d1788aa1f8c7ae29708e224555cce714b18d30bc7ac3d56fe32c.log]
2021/01/26 18:52:48 =====================================

看結果成功取得了想要的數(shù)據(jù)浑劳,符合預期

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末阱持,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子魔熏,更是在濱河造成了極大的恐慌衷咽,老刑警劉巖鸽扁,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镶骗,居然都是意外死亡桶现,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門鼎姊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骡和,“玉大人,你說我怎么就攤上這事此蜈〖春幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵裆赵,是天一觀的道長。 經常有香客問我跺嗽,道長战授,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任桨嫁,我火速辦了婚禮植兰,結果婚禮上,老公的妹妹穿的比我還像新娘璃吧。我一直安慰自己楣导,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布畜挨。 她就那樣靜靜地躺著筒繁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巴元。 梳的紋絲不亂的頭發(fā)上毡咏,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音逮刨,去河邊找鬼呕缭。 笑死,一個胖子當著我的面吹牛修己,可吹牛的內容都是我干的恢总。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼睬愤,長吁一口氣:“原來是場噩夢啊……” “哼片仿!你這毒婦竟也來了?” 一聲冷哼從身側響起戴涝,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤滋戳,失蹤者是張志新(化名)和其女友劉穎钻蔑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸鸯,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咪笑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了娄涩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窗怒。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蓄拣,靈堂內的尸體忽然破棺而出扬虚,到底是詐尸還是另有隱情,我是刑警寧澤球恤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布辜昵,位于F島的核電站,受9級特大地震影響咽斧,放射性物質發(fā)生泄漏堪置。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一张惹、第九天 我趴在偏房一處隱蔽的房頂上張望舀锨。 院中可真熱鬧,春花似錦宛逗、人聲如沸坎匿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽替蔬。三九已至,卻和暖如春侥锦,著一層夾襖步出監(jiān)牢的瞬間进栽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工恭垦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留快毛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓番挺,卻偏偏與公主長得像唠帝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子玄柏,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容