当前位置:   article > 正文

Elasticsearch 分组分页排序查询_elasticsearch分组查询

elasticsearch分组查询

背景:elasticsearch聚合之后进行分页是非常常见的操作
 

实现思路:

        基于es聚合函数bucket_sort、terms和指标聚合cardinality实现

实现方式:(以会员编码分组分页展示会员最近一条时间记录排序为例):

1、查询实现

  1. // 桶排序聚合
  2. BucketSortPipelineAggregationBuilder bucketSortAggregation = PipelineAggregatorBuilders.bucketSort(
  3. "sortCustomer", Lists.emptyList()).from((pageNo.intValue() - 1) * pageSize.intValue()).size(pageSize.intValue());
  4. //分页指标--用于统计分页total总数
  5. CardinalityAggregationBuilder cardinalityAggregation = AggregationBuilders.cardinality("custCard").field("customer_no.keyword");
  6. //返回字段取最新一条记录
  7. TopHitsAggregationBuilder topHitsAggregation = AggregationBuilders.topHits("latestCust")
  8. .fetchSource(new String[]{"customer_no", "customer_name", "identify_no", "visit_time", "service_item_names", "organization_name", "id", "type"} , null).size(1) .sort("visit_time_long", SortOrder.DESC);
  9. //以会员编码分组
  10. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("topCustomer").field("customer_no.keyword")
  11. .size(pageNo.intValue() * pageSize.intValue())
  12. .subAggregation(bucketSortAggregation)
  13. .subAggregation(topHitsAggregation);
  14. //es查询 分页指标和分组terms要同级
  15. //hit查询返回0条数据
  16. searchSourceBuilder.size(0);
  17. searchSourceBuilder.from(0);
  18. //排序
  19. searchRequest.source(searchSourceBuilder.sort("visit_time_long", SortOrder.DESC));
  20. //query条件--正常查询条件
  21. searchRequest.source(searchSourceBuilder.query(boolBuilder));
  22. //聚合条件 分组+分页指标 searchRequest.source(searchSourceBuilder.aggregation(termsAggregationBuilder));
  23. searchRequest.source(searchSourceBuilder.aggregation(cardinalityAggregation));

2、es语句

  1. GET /xxxxx/_search
  2. {
  3. "from": 0,
  4. "size": 0,
  5. "query": {
  6. "bool": {
  7. "must": [
  8. {
  9. "term": {
  10. "del_flag": {
  11. "value": false,
  12. "boost": 1
  13. }
  14. }
  15. }
  16. ],
  17. "adjust_pure_negative": true,
  18. "boost": 1
  19. }
  20. },
  21. "sort": [
  22. {
  23. "visit_time_long": {
  24. "order": "desc"
  25. }
  26. }
  27. ],
  28. "aggregations": {
  29. "topCustomer": {
  30. "terms": {
  31. "field": "customer_no.keyword",
  32. "size": 5,
  33. "min_doc_count": 1,
  34. "shard_min_doc_count": 0,
  35. "show_term_doc_count_error": false,
  36. "order": [
  37. {
  38. "_count": "desc"
  39. },
  40. {
  41. "_key": "asc"
  42. }
  43. ]
  44. },
  45. "aggregations": {
  46. "latestCust": {
  47. "top_hits": {
  48. "from": 0,
  49. "size": 1,
  50. "version": false,
  51. "seq_no_primary_term": false,
  52. "explain": false,
  53. "_source": {
  54. "includes": [
  55. "customer_no",
  56. "customer_name",
  57. "identify_no",
  58. "visit_time",
  59. "service_item_names",
  60. "id",
  61. "type"
  62. ],
  63. "excludes": []
  64. },
  65. "sort": [
  66. {
  67. "visit_time_long": {
  68. "order": "desc"
  69. }
  70. }
  71. ]
  72. }
  73. },
  74. "sortCustomer": {
  75. "bucket_sort": {
  76. "sort": [],
  77. "from": 0,
  78. "size": 5,
  79. "gap_policy": "SKIP"
  80. }
  81. }
  82. }
  83. },
  84. "custCard": {
  85. "cardinality": {
  86. "field": "customer_no.keyword"
  87. }
  88. }
  89. }
  90. }

es查询结果:

3、java获取结果

最终实现分组分页排序功能


参考:Bucket aggregations | Elasticsearch Guide [8.4] | Elastic 

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

闽ICP备14008679号