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



 // 桶排序聚合
 BucketSortPipelineAggregationBuilder bucketSortAggregation = PipelineAggregatorBuilders.bucketSort(
                "sortCustomer", Lists.emptyList()).from((pageNo.intValue() - 1) * pageSize.intValue()).size(pageSize.intValue());


 //分页指标--用于统计分页total总数
        CardinalityAggregationBuilder cardinalityAggregation = AggregationBuilders.cardinality("custCard").field("customer_no.keyword");


//返回字段取最新一条记录
        TopHitsAggregationBuilder topHitsAggregation = AggregationBuilders.topHits("latestCust")
                .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);


//以会员编码分组
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("topCustomer").field("customer_no.keyword")
                .size(pageNo.intValue() * pageSize.intValue())
                .subAggregation(bucketSortAggregation)
                .subAggregation(topHitsAggregation);


//es查询 分页指标和分组terms要同级

//hit查询返回0条数据
 searchSourceBuilder.size(0);
 searchSourceBuilder.from(0);
//排序
  searchRequest.source(searchSourceBuilder.sort("visit_time_long", SortOrder.DESC));
//query条件--正常查询条件
  searchRequest.source(searchSourceBuilder.query(boolBuilder));
//聚合条件 分组+分页指标    searchRequest.source(searchSourceBuilder.aggregation(termsAggregationBuilder));
searchRequest.source(searchSourceBuilder.aggregation(cardinalityAggregation));

2、es语句


GET /xxxxx/_search
{
  "from": 0,
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "del_flag": {
              "value": false,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "sort": [
    {
      "visit_time_long": {
        "order": "desc"
      }
    }
  ],
  "aggregations": {
    "topCustomer": {
      "terms": {
        "field": "customer_no.keyword",
        "size": 5,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      },
      "aggregations": {
        "latestCust": {
          "top_hits": {
            "from": 0,
            "size": 1,
            "version": false,
            "seq_no_primary_term": false,
            "explain": false,
            "_source": {
              "includes": [
                "customer_no",
                "customer_name",
                "identify_no",
                "visit_time",
                "service_item_names",
                "id",
                "type"
              ],
              "excludes": []
            },
            "sort": [
              {
                "visit_time_long": {
                  "order": "desc"
                }
              }
            ]
          }
        },
        "sortCustomer": {
          "bucket_sort": {
            "sort": [],
            "from": 0,
            "size": 5,
            "gap_policy": "SKIP"
          }
        }
      }
    },


![img](https://img-blog.csdnimg.cn/img_convert/28a721d0554d37522ed3dcb6d8c20049.png)
![img](https://img-blog.csdnimg.cn/img_convert/2b8c7a16620c13c56d3718019dc92173.png)
![img](https://img-blog.csdnimg.cn/img_convert/f1f8889fc91817fcb536816a8975aef9.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

meHBqf-4701983257030)]
[外链图片转存中...(img-FiyyloWP-4701983257031)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 中,深度分页功能的使用需要考虑到性能问题。一般来说,建议不要使用过深的分页,以避免对 Elasticsearch 的性能造成负面影响。 以下是在 Elasticsearch 中使用深度分页的方法: 1. 使用 scroll API 进行深度分页查询 scroll API 可以在内存中存储搜索上下文,而不是在每个请求之间重新计算。这使得在大数据集上进行深度分页查询变得更加有效。 示例代码: ``` SearchRequest searchRequest = new SearchRequest("indexName"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.size(100); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); String scrollId = searchResponse.getScrollId(); SearchHit[] searchHits = searchResponse.getHits().getHits(); while (searchHits != null && searchHits.length > 0) { SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); scrollRequest.scroll(TimeValue.timeValueMinutes(1L)); SearchResponse scrollResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT); scrollId = scrollResponse.getScrollId(); searchHits = scrollResponse.getHits().getHits(); // Do something with searchHits } ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); clearScrollRequest.addScrollId(scrollId); client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT); ``` 在上面的示例中,size 参数设置为 100,表示每次检索返回 100 个结果。scroll API 的 scroll 参数设置为 1 分钟,表示在这段时间内保持搜索上下文。 2. 使用 search_after 参数进行深度分页查询 search_after 参数可以用来指定上一次搜索的最后一个结果,以便从下一个结果开始进行分页查询。 示例代码: ``` SearchRequest searchRequest = new SearchRequest("indexName"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.size(100); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); SearchHit[] searchHits = searchResponse.getHits().getHits(); while (searchHits != null && searchHits.length > 0) { SearchHit lastHit = searchHits[searchHits.length - 1]; searchSourceBuilder.searchAfter(lastHit.getSortValues()); searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); searchHits = searchResponse.getHits().getHits(); // Do something with searchHits } ``` 在上面的示例中,size 参数设置为 100,表示每次检索返回 100 个结果。search_after 参数使用上一次搜索的最后一个结果的排序值。 总之,深度分页查询Elasticsearch 中的实现需要考虑性能问题,建议使用 scroll API 或 search_after 参数来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值