golang實現(xiàn)es根據(jù)某個字段分組嘁锯,對某個字段count總數(shù)宪祥,對某個字段sum求和

業(yè)務需求:

索引名:dna、series

關(guān)系:一個series 有 n 個dna家乘,series 與 dna關(guān)系為 1 :n

要求:實現(xiàn)按照dna發(fā)行數(shù)量(系列下dna的總數(shù))或者發(fā)行金額(系列下dnadna_price總數(shù))排序蝗羊,同時支持分頁功能

思路:根據(jù) 系列(series_Id 字段)分組,對dna中id字段count總數(shù)烤低,dna_price字段sum求和

dna索引結(jié)構(gòu)如下:

type Dna struct {
    App struct {
        AcCode     string `json:"ac_code"`
        BifUserBid string `json:"bif_user_bid"`
        Id         string `json:"id"`
        Name       string `json:"name"`
        Type       int    `json:"type"`
        ChainName  string `json:"chainName"`
    } `json:"app"`
    BifUser struct {
        Dna721ContractAddress string `json:"dna721_contract_address"`
    } `json:"bif_user"`
    Category   string    `json:"category"`
    CreateTime time.Time `json:"create_time"`
    DisplayUrl string    `json:"display_url"`
    DnaPrice   string    `json:"dna_price"`
    Id         string    `json:"id"`
    Name       string    `json:"name"`
    Number     string    `json:"number"`
    OwnerBid   string    `json:"owner_bid"`
    Series     struct {
        Issuer string `json:"issuer"`
        Name   string `json:"name"`
    } `json:"series"`
    SeriesId string `json:"series_id"`
    Status   int    `json:"status"`
    TokenBid string `json:"token_bid"`
    Url      string `json:"url"`
}

es查詢語句

{
  "aggregations": {
    "dnaCountsGroup": {
      "aggregations": {
        "bucket_field": {
          "bucket_sort": {
            "from": 3,
            "size": 3
          }
        },
        "dna_counts_num": {
          "value_count": {
            "field": "id"
          }
        },
        "dna_price_num": {
          "sum": {
            "field": "dna_price"
          }
        }
      },
      "terms": {
        "field": "series_id",
        "order": [
          {
            "dna_counts_num": "desc"
          }
        ],
        "size": 8
      }
    }
  },
  "query": {
    "term": {
      "app.id": "09c464e4-9e11-439a-a6ce-6429022f9284"
    }
  }
  
}

es查詢結(jié)果

"aggregations": {
    "dnaCountsGroup": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
            {
                "key": "e499e06b-f135-49c8-835e-e7997e753bd0",
                "doc_count": 100,
                "dna_price_num": {
                    "value": 124.00000095367432
                },
                "dna_counts_num": {
                    "value": 100
                }
            },
            {
                "key": "db0d20bf-69d1-4d72-baa4-4c70a96eadd4",
                "doc_count": 27,
                "dna_price_num": {
                    "value": 170039.40000009537
                },
                "dna_counts_num": {
                    "value": 27
                }
            },
            {
                "key": "09a1febc-1cd9-4199-8eb9-cf55ccf64c98",
                "doc_count": 1,
                "dna_price_num": {
                    "value": 10000
                },
                "dna_counts_num": {
                    "value": 1
                }
            }
        ]
    }
}

go實現(xiàn)

CountAggregations

type CountAggregations struct {
    Aggregations struct {
        DnaCountsGroup struct {
            DocCountErrorUpperBound int `json:"doc_count_error_upper_bound"`
            SumOtherDocCount        int `json:"sum_other_doc_count"`
            Buckets                 []struct {
                Key         string `json:"key"`
                DocCount    int64  `json:"doc_count"`
                DnaPriceNum struct {
                    Value float64 `json:"value"`
                } `json:"dna_price_num"`
                DnaCountsNum struct {
                    Value int64 `json:"value"`
                } `json:"dna_counts_num"`
            } `json:"buckets"`
        } `json:"dnaCountsGroup"`
    } `json:"aggregations"`
}

SeriesReq

type SeriesReq struct {
    AppId    string `form:"appId"`
    PageNum  int    `form:"pageNum"`                             // 頁碼
    PageSize int    `form:"pageSize"`                            // 條數(shù)
    Field    string `form:"field,optional" validate:"omitempty"` // dnaCounts:根據(jù)發(fā)行數(shù)量排序 肘交; dnaPrice:根據(jù)發(fā)行金額排序
    Sort     string `form:"sort,optional" validate:"omitempty"`  // descend降序,ascend升序
}

logic:

var counts CountAggregations
var result *elastic.SearchResult
var req    SeriesReq

// group
dnaCountsGroup := elastic.NewTermsAggregation().Field("series_id")
switch req.Sort {
case "descend":
    dnaCountsGroup.OrderByAggregation("dna_counts_num", false)
case "ascend":
    dnaCountsGroup.OrderByAggregation("dna_counts_num", true)
default:
    dnaCountsGroup.OrderByAggregation("dna_counts_num", false)
}
dnaCountsGroup.Size(int(total))

// search
searchSource := elastic.NewSearchSource()

// count id 字段
dnaCountsNum := elastic.NewValueCountAggregation().Field("id")
dnaCountsGroup.SubAggregation("dna_counts_num", dnaCountsNum)

// sum dna_price 字段
dnaPriceSum := elastic.NewSumAggregation().Field("dna_price")
dnaCountsGroup.SubAggregation("dna_price_num", dnaPriceSum)

bucketSort := elastic.NewBucketSortAggregation().From((req.PageNum - 1) * req.PageSize).Size(req.PageSize)
dnaCountsGroup.SubAggregation("bucket_field", bucketSort)

searchSource.Aggregation("dnaCountsGroup", dnaCountsGroup)

query := elastic.NewTermQuery("app.id", req.AppId)

result, err = l.svcCtx.OEsClient.OClient.Search().Index("dna").SearchSource(searchSource).Query(query).Do(l.ctx)
if err != nil {
    return nil, err
}

b, err := json.Marshal(result)
if err != nil {
    return nil, err
}
if err := json.Unmarshal(b, &counts); err != nil {
    return nil, err
}
fmt.Println("counts=", counts.Aggregations.DnaCountsGroup.Buckets)

for i, p := range counts.Aggregations.DnaCountsGroup.Buckets {

    seriesResList = append(seriesResList, &types.SeriesRes{
        SeriesId:  p.Key,
        DnaPrice:  p.DnaPriceNum.Value,
        DnaCounts: p.DnaCountsNum.Value,
    })

    dox, err := l.svcCtx.OEsClient.OClient.Get().Index("series").Id(p.Key).Do(l.ctx)
    if err != nil {
        return nil, err
    }
    var serie models.Series
    err = l.svcCtx.OEsClient.GetUnmarshal(&dox.Source, &serie)
    if err != nil {
        return nil, err
    }
    seriesResList[i].SeriesDescription = serie.Description
    seriesResList[i].SeriesName = serie.Name
    seriesResList[i].Issuer = serie.Issuer
    seriesResList[i].ExternalUrl = serie.ExternalUrl
}

接口請求結(jié)果:

{
    "code": 0,
    "msg": "ok",
    "data": {
        "items": [
            {
                "seriesName": "萌萌圖可",
                "seriesId": "e499e06b-f135-49c8-835e-e7997e753bd0",
                "externalUrl": "http://www.baidu.com/",
                "seriesDescription": "",
                "issuer": "發(fā)行方公司",
                "dnaCounts": 100,
                "dnaPrice": 124.00000095367432
            },
            {
                "seriesName": "測試集合hh2",
                "seriesId": "db0d20bf-69d1-4d72-baa4-4c70a96eadd4",
                "externalUrl": "http://www.baidu.com/",
                "seriesDescription": "萌萌",
                "issuer": "發(fā)行方公司",
                "dnaCounts": 27,
                "dnaPrice": 170039.40000009537
            },
            {
                "seriesName": "測試集合5",
                "seriesId": "09a1febc-1cd9-4199-8eb9-cf55ccf64c98",
                "externalUrl": "http://www.baidu.com/",
                "seriesDescription": "萌萌",
                "issuer": "發(fā)行方公司",
                "dnaCounts": 1,
                "dnaPrice": 10000
            }
        ],
        "total": 8,
        "pageNum": 2,
        "pageSize": 3
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扑馁,一起剝皮案震驚了整個濱河市涯呻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腻要,老刑警劉巖复罐,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雄家,居然都是意外死亡效诅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門趟济,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乱投,“玉大人,你說我怎么就攤上這事顷编∑蒽牛” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵媳纬,是天一觀的道長双肤。 經(jīng)常有香客問我,道長钮惠,這世上最難降的妖魔是什么茅糜? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮素挽,結(jié)果婚禮上蔑赘,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好米死,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布锌历。 她就那樣靜靜地躺著贮庞,像睡著了一般峦筒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窗慎,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天物喷,我揣著相機與錄音,去河邊找鬼遮斥。 笑死峦失,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的术吗。 我是一名探鬼主播尉辑,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼较屿!你這毒婦竟也來了隧魄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤隘蝎,失蹤者是張志新(化名)和其女友劉穎购啄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘱么,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡狮含,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了曼振。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片几迄。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冰评,靈堂內(nèi)的尸體忽然破棺而出映胁,到底是詐尸還是另有隱情,我是刑警寧澤集索,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布屿愚,位于F島的核電站,受9級特大地震影響务荆,放射性物質(zhì)發(fā)生泄漏妆距。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一函匕、第九天 我趴在偏房一處隱蔽的房頂上張望娱据。 院中可真熱鬧,春花似錦盅惜、人聲如沸中剩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽结啼。三九已至掠剑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郊愧,已是汗流浹背朴译。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留属铁,地道東北人眠寿。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像焦蘑,于是被迫代替她去往敵國和親盯拱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容