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

这篇具有很好参考价值的文章主要介绍了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 {
		return nil, err
	}
	var ownerCounts models.EsCountAgg
	err = json.Unmarshal(ownerRes.Aggregations["ownerCount"], &ownerCounts)
	if err != nil {
		return nil, 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://www.toymoban.com/news/detail-580757.html

到了这里,关于golang实现es根据某字段分组,统计每组某一字段的数量,过滤空值并去重的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【SQL】对表中的记录通过时间维度分组,统计出每组的记录条数

    【SQL】对表中的记录通过时间维度分组,统计出每组的记录条数

    场景:一般用作数据统计,比如统计一个淘宝用户在年、月、日的维度上的订单数。 业务:一个集合,以时间维度来进行分组求和。 准备一张订单表order,有一些常规属性,比如创建时间,订单号。 DDL语句如下: 测试数据准备如下,50条DML语句,其中order_date分布在2023年1月

    2024年01月16日
    浏览(14)
  • MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段

    MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段

    在编写MySQL数据库查询语句时,经常遇到使用GROUP BY分组后,需要获取每组中时间记录最新的行对应的其他字段这一情况。例如下表(t_score): id student course score examdate 1 小张 语文 89.0 2023-06-29 2 小张 数学 90.0 2023-06-29 3 小张 语文 91.0 2024-01-10 4 小张 数学 93.0 2024-01-10 5 小李 语

    2024年01月17日
    浏览(9)
  • MySQL如何查询根据某一条件分组,再查询出每组数据中时间最早或最晚的数据

    最近遇到个需求,需要先根据A条件进行分组,然后查询出每组数据中时间最近的一条数据,立马就写出了sql语句 但是执行了一下,发现不对,子查询中 order by 貌似失效了,查出来的数据并不是要想要的时间最近的数据。 经过我的研究,发现,想要子查询中使用order by生效,

    2024年03月09日
    浏览(10)
  • HIVE SQL 根据主键去重并实现其余字段分组聚合

    HIVE SQL 根据主键去重并实现其余字段分组聚合

    相同个人id下所有字段按时间顺序补位,取首个不为空值 * 注意:此处是取的首个不为空(即不为null)的字段,所以在实际使用过程中应提前将空字符串转为null值。

    2024年02月16日
    浏览(10)
  • Mysql分组排序取每组第一条(二种实现方式)

    Mysql分组排序取每组第一条(二种实现方式)

    记录一下最近的一个需求,查不同产品排名第一的图片作为主图 其实一开始想用的是 mybatis的级联查询 ,结果说需要一次性全部查出来 那就没事了,改 sql 咯: 亲测实用 MySQL:8.0 Java:1.8 建表语句: 这一种也是网上推荐最多的,但个人觉得局限性太大,不介意用在实战上

    2024年02月06日
    浏览(11)
  • 【Sql】根据字段分组排序,取其第一条数据

    【Sql】根据字段分组排序,取其第一条数据

    (1)问题描述 有时候我们需要对数据进行去重处理,例如查询结果里的文件名有重复,我们希望可以按照创建时间排序,最终结果里每个文件名只取创建时间最近的一个。 (2)有哪些问题 想到去重,可以想到使用distinct或者group by分组。但是这两者有个问题,例如我们查询

    2024年02月16日
    浏览(8)
  • 用mysql实现按条件分组并且每组去时间最大的一条

    可以考虑使用子查询或者连接查询实现。以下是两种语法: 其中,组内条件是按照哪个字段进行分组的条件,可以是一个或多个字段。时间是需求中要筛选的时间字段,假设为time字段。这个查询会返回满足组内条件下时间最大的记录。 其中,组内条件和时间的含义同上。这

    2024年02月16日
    浏览(33)
  • MySQL根据出生日期查询年龄,以及对年龄进行分组统计

    MySQL根据出生日期查询年龄,以及对年龄进行分组统计

    表stu数据如下 1. 根据出生日期查询年龄 返回结果: 函数DATE():提取日期或日期/时间表达式的日期部分; 函数CURDATE():返回当前的日期; 函数TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2):计算两个日期的时间差,unit是计算时间差的单位,可以是SECOND秒、MINUTE分钟、HOUR小时、DAY天

    2024年02月11日
    浏览(13)
  • ES统计分组后的分组数量

    工作中遇到需要统计分组数量的查询,记录一下 ps: 按区域分组, 统计有几个区域 结果

    2024年02月07日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包