es 使用 cardinality + collapse做分页去重查询

这篇具有很好参考价值的文章主要介绍了es 使用 cardinality + collapse做分页去重查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.首先我们来介绍一下cardinality的用法

cardinality 即去重计算,类似sql中 count(distinct),先去重再求和,计算指定field值的种类数。

GET/index/_search
{
  "size":0,
  "query": {
    "match_all": {}
  }
  "aggs": {
    "test_count": {
      "cardinality": {
        "field": "name"
      }
    }
  }
}

//返回结果
{
  //...
  "aggregations": {
    "test_count": {
      "value": 5
    }
  }
}

可以看到,aggregations聚合下,返回了按名字查询去重后的结果数,但是只有去重后的条数,没有具体的数据。

2.接下来我们再看一下collapse的用法

collapse是es5以后的新特性collapse ,Field Collapsing(字段折叠)不能与scroll、rescore以及search after 结合使用。

优点:简单,性能好。
注意:collapse的字段需要为keyword或者number类型。
示例:

GET /index/_search
{
    "query": {
        "match": {
            "message": "elasticsearch"
        }
    },
    "collapse" : {
        "field" : "user" 
    }
}



//返回结果
{
	"hits": {
		"total": 2,
		"max_score": 4.276666,
		"hits": [{
			"_index": "index",
			"_type": "type",
			"_id": "kiRgoHsBtpTqY8pwLiMi",
			"_score": 4.276666,
			"_source": {
				//数据展示
			},
			"fields": {
				"message: [
					"elasticsearch"
				]
			}
		}]
	}
}

这里可以看到,我们使用collapse对查询数据进行去重后的结果,刚好与cardinality返回的总条数完美结合,构成了分页必备的条件。

3,实战演示

下面我们随便写一个查询语句,将两者结合起来

{
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "personid": {
                            "lt": "1000000000"
                        }
                    }
                },
                {
                    "bool": {
                        "should": [],
                        "minimum_should_match": 1
                    }
                },
                {
                    "term": {
                        "isDeleted": "0"
                    }
                }
            ]
        }
    },
    "collapse": {
        "field": "course_id"
    },
    "from": 0,
    "size": 10,
    "track_total_hits": true,
    "aggs": {
      "courseAgg": {
        "cardinality": {
          "field": "course_id"
        }
      }
    }
}

返回结果如下

{
  "took" : 140,
  "timed_out" : false,
  "_shards" : {
    "total" : 6,
    "successful" : 6,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2111,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [...]
  },
  "aggregations" : {
    "courseAgg" : {
      "value" : 1070
    }
  }
}

解释说明:

1.hits中total的总条数实际上是去重前的总条数,原数据条数,这里我们知道就行,分页中我们并不使用它。hits中数组的大小刚好等于courseAgg聚合的值,数组中的数据就是去重后的数据。

2.aggregations中的courseAgg条数,这个才是去重后的实际条数,也是分页用的总条数。

3.from 查询的偏移量,也就是从哪里开始查。

4.size 查询条数,一次查几条。

接下来,你就可以把它当做一个简单分页查询来用了,传入from和size就ok啦~

是不是比聚合后去重在分页简单多了???文章来源地址https://www.toymoban.com/news/detail-790106.html

到了这里,关于es 使用 cardinality + collapse做分页去重查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 后端一次返回大量数据,前端做分页处理

    问题描述:后端接口返回大量数据,没有做分页处理,不支持传参pageNum,pageSize 本文为转载文章,原文章:后端一次返回大量数据,前端做分页处理 1.template中 分页 对应的模型 2.script中 获取后端数据 改变页数事件 改变条数事件

    2024年02月15日
    浏览(43)
  • es 分页查询

    1、from和size是查询所有数据,然后剔除不要的部分 2、scroll是记录了一个读取的位置,保证下一次快速继续读取 scroll 查询阶段:将查询的结果集,doc_id列表保存在了一个上下文里 fetch阶段:根据size取回即可 Query阶段:每个shard将命中的结果( doc_id和_score) 按照 _score 顺序在

    2023年04月09日
    浏览(31)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(58)
  • Elasticsearch ES操作:查询数据(全部、分页、单条)

    查询 条件查询 指定条数 返回结果

    2024年02月16日
    浏览(37)
  • ES(Elasticsearch)+SpringBoot实现分页查询

    1.ES介绍   ES作为一个搜索工具,寄托于Lucene之上,提供了方便的数据存储和搜索服务,一般的用它来作为网页数据索引以及存储用户画像(即用户标签)数据,可以提供复具有复杂的查询条件的服务。例如在网页索引中,通过倒排的方式索引的方式,对文档进行分词存储,

    2024年02月16日
    浏览(44)
  • 若依框架ruoyi前后端实现自定义分页功能(ES分页查询)

    若依 ruoyi 框架主要针对 Sql 进行了分页集成,像平时别的一些数据库或者中间件的分页,则需要自己实现. 本文主要使用 ES 的分页查询为例,展示前后端的基本操作,原理可以类推到其他中间件分页查询上.

    2024年02月12日
    浏览(53)
  • 若依整合Easy-Es实现文章列表分页查询

    Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比M

    2024年01月16日
    浏览(41)
  • java 整合ES实现文档增删改查(多条件分页查询)

    本文采用ES版本为8.7.1 由于只存储文章,仅用固定索引即可,索引用kibanna直接生成,省略索引部分的增删查步骤 抓取返回信息是因为版本问题无法解析ES返回的正确信息,实际操作成功但是会报错 我这边只需要单索引操作,有需求的可以让前端传过来

    2024年02月13日
    浏览(40)
  • 【问题排查篇】一次业务问题对 ES 的 cardinality 原理探究

    作者:京东科技 王长春 小编工作中负责业务的一个服务端系统,使用了 Elasticsearch 服务做数据存储,业务运营人员反馈,用户在使用该产品时发现, 用户后台统计的订单笔数和导出的订单笔数不一致 ! 交易订单笔数不对,出现差错订单了?这一听极为震撼!出现这样的问

    2024年02月03日
    浏览(38)
  • ElasticSearch第六讲 ES 三种分页查询from+size / Scroll /search_after

    我的Git地址:https://gitee.com/ITLULU 欢迎访问 ES的分页查询和关系数据库的分页查询的区别: ES分页查询有以下几种: 1:简单的 from size (有默认的最大Size,不可无限大小查询,因为数据过多查询性能会降低,且也要考虑内存问题,以及OS缓存数据的能力) 2: scroll基于查询窗口

    2024年02月01日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包