Elasticsearch按某个字段去重-实现group by效果

这篇具有很好参考价值的文章主要介绍了Elasticsearch按某个字段去重-实现group by效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求分析 

1、现实需求 

已知es中存储了一张学生课程信息宽表,里边包含有student_name、student_id、teacher_id、课程信息等字段。

现在根据学生姓名或者班级ID,得出学生所在班级的所有授课教师信息。 

2、需求分析 

既然是明细宽表,里边的教师的信息必然是有重复的,因此我们需要查询teacher_id的集合并去重,对teacher_id实现SQL中的distinct或group by操作。然后再拿着查询出的不重复的teacher_id集去教师表查询每个教师的相关信息。

2、解决思路  

方式(1)字段aggs与top_hits:在内存中完成操作,性能损耗大

方式(2)collapse折叠:性能高,api操作简单

方式(1)有损性能,不推荐使用,下边是方式(2)为的操作代码


二、操作示例 

下边是JSON查询语句,must指定匹配条件,includes查询指定字段,collapse指定去重字段

1、原生的JSON格式 

{
	"query": {
		"bool": {
			"must": [{
					"term": {"status": {"value": 1}}
				},
				{
					"bool": {
						"should": [{
								"term": { "student_name": {"value": "zhangsan" }}
							},
							{
								"terms": {"class_id": [101]}
							}
						]
					}
				}
			]
		}
	},
	"_source": {
		"includes": ["teacher_id"],
		"excludes": []
	},
	"collapse": {"field": "teacher_id"}
}

2、Java语言的API

Java的API参考关键代码示例如下:文章来源地址https://www.toymoban.com/news/detail-520860.html

    public List<String> queryTeacherIds(List<Long> classIds, String studentName) {
    	List<String> idList = new ArrayList<>();
    	try{
    		//自行获取客户端连接
            RestHighLevelClient client = esConf.getClient();
            
            BoolQueryBuilder mustBoolQueryBuilder = QueryBuilders.boolQuery();
            mustBoolQueryBuilder.must(QueryBuilders.termQuery("status", 2));
            
            BoolQueryBuilder shouldBoolQueryBuilder = QueryBuilders.boolQuery();
            if(CollectionUtils.isNotEmpty(classIds)){
            	shouldBoolQueryBuilder.should(QueryBuilders.termsQuery("class_id", classIds));
            }
            if(StringUtils.isNotBlank(studentName)){
            	shouldBoolQueryBuilder.should(QueryBuilders.termsQuery("student_name",studentName));
            }
            mustBoolQueryBuilder.must(shouldBoolQueryBuilder);
            
            String teacherId = "teacher_id";
            String [] includes = {teacherId};//指定查询哪些字段
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(mustBoolQueryBuilder).fetchSource(includes,null).collapse(new CollapseBuilder(teacherId));

            SearchRequest searchRequest = new SearchRequest(erpIndex).source(sourceBuilder);
            logger.info("searchRequest:{}", searchRequest.toString());
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            logger.info("searchResponse:{}", searchResponse.toString());
            
            if(searchResponse!=null && searchResponse.getHits().getHits().length > 0){
                SearchHits searchHits = searchResponse.getHits();
                SearchHit[] hits = searchHits.getHits();
                for(SearchHit hit:hits){
                    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                    Object teacherIdObj = sourceAsMap.get(teacherId);
                    idList.add(String.valueOf(teacherIdObj));
                }
            }
        }catch ( Exception e){
            logger.error("getPopAllowanceIds err{}",e);
            Profiler.businessAlarm("AllowanceSkuEsServiceImpl.querySkuByPage.Exception", String.format("getErpAllowanceIds查询es出错:%s", e));
        }
    	return idList;
    }

到了这里,关于Elasticsearch按某个字段去重-实现group by效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • MySQL中去重 distinct 和 group by 是如何去重的

     测试1:对name 字段进行过滤  测试2:对所有的字段进行去重。   对比测试1和测试2 发现, distinct 可以对 单一字段进行去重 ,当对所有的字段去重时,只有 不同数据的每个字段完全一样的数据被 去掉,其他只有一个字段重复的数据并没有变化,因此得出结论: distinct主要

    2024年02月07日
    浏览(50)
  • hive中Distinct和group by去重的对比

            在Hive中, DISTINCT和GROUP BY都可以用于去重,但是它们背后的实现方式是不同的,因此它们的效率也是不同的。         DISTINCT是一种去重方法,它会扫描整个数据集,然后将重复的记录删除,只留下唯一的记录 。由于DISTINCT需要扫描整个数据集,因此它在处理

    2024年02月04日
    浏览(55)
  • SQL结果-根据某个字段取最新时间去重

    现在有个sql,如果“propertyId”相同,取“updateTime”时间最新的那条记录,其他过滤掉。 结果SQL 为了通过 propertyId 去重并获取每个 propertyId 对应的最新时间的记录,可以使用窗口函数 ROW_NUMBER() 来对每个分组进行排序,并在外部查询中取出 rn 列等于 1 的行,即每个分组中的第

    2024年02月07日
    浏览(59)
  • elasticsearch实现根据某一个字段去重后并求总数

    版本说明: elasticsearch:elasticsearch-7.12.1 kibana:kibana-7.12.1-windows-x86_64 原始数据: _index _type _id _score address age bir id name jason_doc_10 _doc L2aqNoABfXKo_Zq7BPkO 1 中国深圳 69 1650184553376 daZhaoLiu 大赵六 jason_doc_10 _doc MGaqNoABfXKo_Zq7mfma 1 中国上海市宝山区 20 1649862303342 user001 大张三 jason_doc_10

    2023年04月08日
    浏览(33)
  • golang实现es根据某字段分组,统计每组某一字段的数量,过滤空值并去重

    需求: 索引:dna 需求:根据app.Id分组,统计每组的OwnerBid数量,过滤空值并去重 dna索引结构 es查询语句 es查询结果 goalng实现 models.EsCountAgg 【面向校招】全力备战2023Golang实习与校招 欢迎进群交流:1007576722

    2024年02月17日
    浏览(48)
  • mysql group by 字段 与 select 字段

    表数据如下: 执行SQL语句1: SELECT * FROM `z_course` GROUP BY NAME,SEX  结果:   执行SQL语句2: SELECT * FROM `z_course` GROUP BY NAME    sql 1 根据 name,sex 两个字段分组,查询 所有字段,返回结果 sql 2 根据 name 字段分组,查询所有字段,返回结果 sql2 和 sql1 的区别是 分组少了 sex字段,那

    2024年02月10日
    浏览(46)
  • java stream distinct根据list某个字段去重

    java stream distinct根据list某个字段去重,普通List简单去重: 很显然这种满足不了需求,我们List里的是实体对象,这里的是字符串。 首先创建了一个Student类,该类包含id、name、age三个字段,使用了注解@Data,我们想根据学生的name去重。 一、Stream流 + TreeSet(推荐) 根据学生的

    2024年01月17日
    浏览(85)
  • 【elasticsearch】ES去重查询实现

    去重实现原理: 采用es 的Collapse折叠+cardinality基数计算 实现去重 1、优点:简单快速效率高,几乎无性能损耗(相比于分桶去重) 2、缺点: 1)Collapse折叠只支持一个字段去重,且字段必须是 keyword 2)cardinality基数计算去重后数量 (采用hyperloglog实现,hyperloglog一种近似计算)

    2024年02月06日
    浏览(40)
  • ElasticSearch_dsl实现多字段查询去重过滤详解(script)

    ElasticSearch单字段去重详见博文:ElasticSearch单字段查询去重详解_IT之一小佬的博客-CSDN博客 ElasticSearch多字段去重详见博文:ElasticSearch多字段查询去重过滤详解_IT之一小佬的博客-CSDN博客 本博文将详细介绍使用elasticsearch_dsl进行多字段进行去重。本文示例数据详见上文单字段博

    2023年04月22日
    浏览(38)
  • Java中使用流将两个集合根据某个字段进行过滤去重?

    要是需要GPT Plus账号的小伙伴可以联系我~ 在Java中,您可以使用流(Stream)来过滤和去重两个集合。下面是一个示例代码,展示如何根据对象的某个字段进行过滤和去重操作: 在这个示例中,我们创建了一个 Person 类表示人员信息,包含 name 和 age 两个字段。我们使用流的 filte

    2024年02月12日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包