当前位置:   article > 正文

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

es collapse

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

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

  1. GET/index/_search
  2. {
  3. "size":0,
  4. "query": {
  5. "match_all": {}
  6. }
  7. "aggs": {
  8. "test_count": {
  9. "cardinality": {
  10. "field": "name"
  11. }
  12. }
  13. }
  14. }
  15. //返回结果
  16. {
  17. //...
  18. "aggregations": {
  19. "test_count": {
  20. "value": 5
  21. }
  22. }
  23. }

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

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

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

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

  1. GET /index/_search
  2. {
  3. "query": {
  4. "match": {
  5. "message": "elasticsearch"
  6. }
  7. },
  8. "collapse" : {
  9. "field" : "user"
  10. }
  11. }
  12. //返回结果
  13. {
  14. "hits": {
  15. "total": 2,
  16. "max_score": 4.276666,
  17. "hits": [{
  18. "_index": "index",
  19. "_type": "type",
  20. "_id": "kiRgoHsBtpTqY8pwLiMi",
  21. "_score": 4.276666,
  22. "_source": {
  23. //数据展示
  24. },
  25. "fields": {
  26. "message: [
  27. "elasticsearch"
  28. ]
  29. }
  30. }]
  31. }
  32. }

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

3,实战演示

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

  1. {
  2. "query": {
  3. "bool": {
  4. "filter": [
  5. {
  6. "range": {
  7. "personid": {
  8. "lt": "1000000000"
  9. }
  10. }
  11. },
  12. {
  13. "bool": {
  14. "should": [],
  15. "minimum_should_match": 1
  16. }
  17. },
  18. {
  19. "term": {
  20. "isDeleted": "0"
  21. }
  22. }
  23. ]
  24. }
  25. },
  26. "collapse": {
  27. "field": "course_id"
  28. },
  29. "from": 0,
  30. "size": 10,
  31. "track_total_hits": true,
  32. "aggs": {
  33. "courseAgg": {
  34. "cardinality": {
  35. "field": "course_id"
  36. }
  37. }
  38. }
  39. }

返回结果如下

  1. {
  2. "took" : 140,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 6,
  6. "successful" : 6,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 2111,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 0.0,
  16. "hits" : [...]
  17. },
  18. "aggregations" : {
  19. "courseAgg" : {
  20. "value" : 1070
  21. }
  22. }
  23. }

解释说明:

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

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

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

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

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

是不是比聚合后去重在分页简单多了???

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号