0


golang实现es根据某字段分组,统计每组某一字段的数量,过滤空值并去重

目录

需求:

索引:dna

需求:根据app.Id分组,统计每组的OwnerBid数量,过滤空值并去重

dna索引结构

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":{"ownerCount":{"aggregations":{"countAgg":{"cardinality":{"field":"owner_bid"}}},"terms":{"field":"app.id","size":5}}},"query":{"bool":{"must_not":{"term":{"owner_bid":""}},"should":{"terms":{"app.id":["e05aca13-34f6-4f3e-88d3-76698cad76c9","691f84ed-8ecc-40ab-8880-4674d93c85e4","c0ffecef-dad8-481c-ae05-1a55e8724327","e0ffbbba-b49e-4570-a4b1-1cb74e4ad2ba","f48717b2-a0a3-41c2-a978-f54299a1e42d"]}}}},"size":0}

es查询结果

{"took":1,"timed_out":false,"_shards":{"total":2,"successful":2,"skipped":0,"failed":0},"hits":{"total":{"value":2941,"relation":"eq"},"max_score":null,"hits":[]},"aggregations":{"ownerCount":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"c0ffecef-dad8-481c-ae05-1a55e8724327","doc_count":2522,"countAgg":{"value":2}},{"key":"e0ffbbba-b49e-4570-a4b1-1cb74e4ad2ba","doc_count":374,"countAgg":{"value":1}},{"key":"f48717b2-a0a3-41c2-a978-f54299a1e42d","doc_count":45,"countAgg":{"value":1}}]}}}

goalng实现

models.EsCountAgg

type EsCountAgg struct{
    DocCountErrorUpperBound int64`json:"doc_count_error_upper_bound"`
    SumOtherDocCount        int64`json:"sum_other_doc_count"`
    Buckets                 []struct{
        Key      string`json:"key"`
        DocCount int64`json:"doc_count"`
        CountAgg struct{
            Value float64`json:"value"`}`json:"countAgg"`}`json:"buckets"`}var appIds []interface{}for_, app :=range appResList {
    appIds =append(appIds, app.AppId)}
appTermsQuery := elastic.NewTermsQuery("app.id", appIds...)
searchDna := l.svcCtx.OEsClient.OClient.Search().Index("dna")// 持有者数量, owner_bid去重,过滤空值,按app.id分组
    searchDna = l.svcCtx.OEsClient.OClient.Search().Index("dna")
    ownerRes, err := searchDna.Query(elastic.NewBoolQuery().Should(appTermsQuery).MustNot(elastic.NewTermQuery("owner_bid",""))).Aggregation("ownerCount", elastic.NewTermsAggregation().Field("app.id").Size(len(appIds)).SubAggregation("countAgg", elastic.NewCardinalityAggregation().Field("owner_bid"))).Size(0).Do(l.ctx)if err !=nil{returnnil, err
    }var ownerCounts models.EsCountAgg
    err = json.Unmarshal(ownerRes.Aggregations["ownerCount"],&ownerCounts)if err !=nil{returnnil, err
    }
    ownerCountM :=make(map[string]int64,len(ownerCounts.Buckets))for_, ownerCount :=range ownerCounts.Buckets {
        ownerCountM[ownerCount.Key]=int64(ownerCount.CountAgg.Value)}for i, app :=range appResList {
        appResList[i].OwnerBidCounts = ownerCountM[app.AppId]}

更多文章

【面向校招】全力备战2023Golang实习与校招

欢迎进群交流:1007576722


本文转载自: https://blog.csdn.net/qq_45696377/article/details/126957398
版权归原作者 胡毛毛_三月 所有, 如有侵权,请联系我们删除。

“golang实现es根据某字段分组,统计每组某一字段的数量,过滤空值并去重”的评论:

还没有评论