<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      go-ElasticSearch TypedClient學(xué)習(xí)筆記

      ElasticSearch

      Elasticsearch(ES)是一個(gè)基于Lucene構(gòu)建的開源、分布式、RESTful接口的全文搜索引擎。Elasticsearch還是一個(gè)分布式文檔數(shù)據(jù)庫(kù),其中每個(gè)字段均可被索引,而且每個(gè)字段的數(shù)據(jù)均可被搜索,ES能夠橫向擴(kuò)展至數(shù)以百計(jì)的服務(wù)器存儲(chǔ)以及處理**PB**級(jí)的數(shù)據(jù)。可以在極短的時(shí)間內(nèi)存儲(chǔ)、搜索和分析大量的數(shù)據(jù)。通常作為具有復(fù)雜搜索場(chǎng)景情況下的核心發(fā)動(dòng)機(jī)。根據(jù)DB-Engines的排名顯示,Elasticsearch`是最受歡迎的企業(yè)搜索引擎。

      go-ealsticsearch

      Elasticsearch 的官方 Go 客戶端go-elasticsearch是由 Elastic 開發(fā)、維護(hù)和支持的客戶端系列的最新成員之一。 初始版本于 2019 年初發(fā)布,并在過去幾年中逐漸成熟,獲得了重試請(qǐng)求、發(fā)現(xiàn)集群節(jié)點(diǎn)和各種輔助組件等功能。

      隨著官方客戶端的發(fā)布和逐漸成熟,原來社區(qū)維護(hù)的客戶端olivere/elastic已經(jīng)逐漸不在維護(hù)了。

      Typed API

      Typed API從簡(jiǎn)單開始,到逐步擴(kuò)展覆蓋更多領(lǐng)域,提升類型安全性和易用性。成為該客戶端庫(kù)的一大特色。

      Typed API早在2.19年的V7版本中就出現(xiàn)了,不過一直處于alpha狀態(tài),直到8.7版本,才基本可用。我用的是最新的8.90版,看到TypedApi的介紹,就選擇入坑選擇了。沒想到,還真的坑啊,基本的增刪改還好,稍微復(fù)雜的用法只能去找examples和tests代碼,加上自己試驗(yàn),連文檔都沒有:(。所以在這里記錄一下我用到的TypedAPI。

      連接EL

       var err error
       esCfg:=es.Config{
         Addresses: []string{"http://192.168.0.134:9200"},
         Username:  "Username",
         Password:  "Password",
       }
       typedClient, err := es.NewTypedClient(esCfg)
       if err != nil {
         log.Fatal("創(chuàng)建TypedClient失敗",err)
       }
       ?
       //
       ctx:=context.TODO()
       ok,err:=typedClient.Ping().IsSuccess(ctx)
       if err != nil {
         log.Fatal("TypedClient ping失敗",err)
       }
       if !ok{
         log.Fatal("connect to EL server fail!")
       }else{
         log.Println("------- connected success")
       }
       log.Printf( "EL info: %#v",typedClient.Info)
       ?

      EL中的實(shí)體類

       type ElKnowledge struct {
        ID          int       `json:"id"`
        KnowledgeID string    `json:"knowledge_id"`
        Title       string    `json:"title"`
        Author      string    `json:"author"`
        Category    string    `json:"category"`
        Keywords    string    `json:"keywords"`
        Content     string    `json:"content"`
        Images      string    `json:"images"`
        Files       string    `json:"files"`
        DAddAt      time.Time `json:"d_add_at"`
        AddAt       string    `json:"add_at"`
        Comments    string    `json:"comments"`
        Scores      string    `json:"scores"`
       }
       func (me *ElKnowledge) SID() string {
        return me.KnowledgeID
       }
       func (me *ElKnowledge) ToJsonRawMessage() json.RawMessage {
        bf, err := json.Marshal(me)
        if err != nil {
        log.Fatalln("[ElKnowledge.ToJson] fail", err)
        }
        return bf
       }
       func (me *ElKnowledge) ToJson() string {
        return string(me.ToJsonRawMessage())
       }
       ?

       

      創(chuàng)建索引

       indexName:="myIndex"
       var ElKnowledgeTypedMapping *types.TypeMapping = &types.TypeMapping{
        Properties: map[string]types.Property{
        "id":           types.NewIntegerNumberProperty(),
        "knowledge_id": types.NewKeywordProperty(),
        "title":        types.NewTextProperty(),
        "category":     types.NewTextProperty(),
        "author":       types.NewTextProperty(),
        "keywords":     types.NewTextProperty(),
        "content":      types.NewTextProperty(),
        "add_at":       types.NewKeywordProperty(),
        "images":       types.NewTextProperty(),
        "files":        types.NewTextProperty(),
        "d_add_at":     types.NewDateProperty(),
        "comments":     types.NewTextProperty(),
        "scores":       types.NewTextProperty(),
        },
       }
       //檢查索引是否存在
       exists,err := typedClient.Indices.Exists(indexName).IsSuccess(ctx)
       if err != nil {
         log.Fatalln ("check index exist failed", err.Error())
       }
       ?
       //索引不存在則創(chuàng)建索引
       //索引不存在時(shí)查詢會(huì)報(bào)錯(cuò),但索引不存在的時(shí)候可以直接插入
       if !exists {
         log.Printf("index %s is not exist, to create", indexName)
         cr, err :=typedClient.Indices.Create(indexName).Request(&create.Request{
           Mappings: ElKnowledgeTypedMapping,
        }).Do(ctx)
         if err != nil {
           log.Fatal("create index failed", err.Error())
        }
         log.Println("index creat",cr.Index)
       }

      新增

       func  insertKnowledge(doc *ElKnowledge){
        sid:=doc.SID()
        rr,err:=typedClient.Create(indexName,sid).Request(&doc).Do(context.TODO())
        if err!=nil{
        log.Fatal(" Insert new doc fail,",err)
        }
        log.Println(" Insert new doc, result=>",rr.Result.String())
       }
       ?

      按ID查詢

       func  GetKnowledge(sid string)(doc *ElKnowledge,ok bool){
        rr,err:=typedClient.Get(indexName,sid).Do(context.TODO())
        if err!=nil{
        log.Println("[GetKnowledge] fail",err)
        return
        }
        if !rr.Found {return }
        doc,err= ElKnowledgeFromJsonRaw(rr.Source_)
        if err!=nil{
        return
        }
        return doc, true
       }
       ?

      修改

       func  upsertKnowledge(doc *ElKnowledge){  
        useUpsert:=true
        sid:=doc.SID()
        js:=doc.ToJson()
        rr,err:=typedClient.Update(indexName,sid).Request(&update.Request{
        Doc: json.RawMessage(js),
        DocAsUpsert: &useUpsert,
        }).Do(context.TODO())
        if err!=nil{
        log.Println("upsert doc fail,",err)
        panic(err)
        }
        log.Println("upserted success, by way=>",rr.Result.String())
       }

      刪除

       func deleteKnowledge(doc *ElKnowledge){
        sid:=doc.SID()
        rr,err:=typedClient.Delete(indexName,sid).Do(context.TODO())
        if err!=nil{
        log.Fatal("Delete doc fail",err)
        }
        log.Println("Deleted, ",rr.Result.String())
       }

       

      查詢

       func Search(c *gin.Context) {
        words:=c.Query("words")
        sfrom:=c.Query("from")
        ssize:=c.Query("size")
        from,_:=strconv.Atoi(sfrom)
        size,_:=strconv.Atoi(ssize)
        res,err:=typedClient.Search().Index("yhkb").Request(&search.Request{
        Query: &types.Query{
        Match: map[string]types.MatchQuery{
        "all_content": { Query: words, Operator: &operator.And},
        },
        },
        Sort: []types.SortCombinations{
        types.SortOptions{
        SortOptions: map[string]types.FieldSort{
        "add_at":{Order: &sortorder.Desc,},
        },
        },
        },
        From: &from,
        Size: &size,
        }).Do(context.Background())
       
        if err != nil {
        msg:=""
        if err,ok:=err.(types.ElasticsearchError);ok{
        b,_:=json.Marshal(err)
        msg=string(b)
        }
        err=utils.WrapErrorWith(err,"查詢失敗"+msg)
        slog.Error("查詢失敗","error",err)
        helper.ResponseJsonError(c, err)
        return
        }
        helper.ResponseJsonData(c,res)
       ?
       }
       
      posted @ 2023-08-04 10:02  柒零壹  閱讀(903)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产一区二区日韩经典| 国产办公室秘书无码精品99| 中文在线天堂中文在线天堂| 亚洲国产欧美日韩另类| 婷婷丁香五月激情综合| 潜山县| 秋霞电影院午夜无码免费视频| 亚洲欧美国产精品久久久久久久| 亚洲天码中文字幕第一页| 成人做爰www网站视频| 鲁一鲁一鲁一鲁一澡| 深夜福利成人免费在线观看| 国产精品福利自产拍久久| 免费看的一级毛片| 日韩精品人妻中文字幕| 亚洲国产精品一区二区第一页| 华人在线亚洲欧美精品| 久久久无码人妻精品无码| 精品婷婷色一区二区三区| 亚洲一区二区av高清| 国产精品久久亚洲不卡| 亚洲人成小说网站色在线| 久久精品免视看国产成人| 亚洲AVAV天堂AV在线网阿V| 色爱无码av综合区| 亚洲一区二区三区水蜜桃| 在线a亚洲老鸭窝天堂| 沧州市| 一区二区三区成人| 国产免费福利网站| 国产精品亚洲二区亚瑟| 成人欧美日韩一区二区三区| 不卡国产一区二区三区| 四虎亚洲国产成人久久精品| 日本伊人色综合网| 啊┅┅快┅┅用力啊岳网站| 韩国免费a级毛片久久| 久久综合国产色美利坚| 国产精品国语对白露脸在线播放 | 开心婷婷五月激情综合社区 | 国产桃色在线成免费视频|