elasticsearch 查询数据-深度分页解决方案

es深度查询时,如果数据量超过10000,es会报错,后续的数据就查不了了,当然,es为我们提供了下查询方案,游标查询或者search_after查询。

以下是 kibana 测试 dsl:

# 1.游标方式
# 第一次查询获取游标,同时处理数据(返回数据中含游标信息)
GET my_results/_search?scroll=1m
{
  "sort": [
    {
      "scores": {
        "order": "asc"
      }
    }
  ],
  "_source": ["policyID", "username", "scores"],
  "size": 10000
}

# 游标第二次及以后,一直往后查询,注意每次取该次游标作为下一次游标继续查询
GET _search/scroll?scroll=1m
{
  "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAM-gqFk8zNHFBeVFaU2tpM0JIcEw1OHU0c0EAAAAAADPoKxZPMzRxQXlRWlNraTNCSHBMNTh1NHNBAAAAAAAz6C0WTzM0cUF5UVpTa2kzQkhwTDU4dTRzQQAAAAAAM-guFk8zNHFBeVFaU2tpM0JIcEw1OHU0c0EAAAAAADPoLBZPMzRxQXlRWlNraTNCSHBMNTh1NHNB"
}

# 2.search_after方式,也称为书签方式
# 第一次查询,注意获取最后一项的值作为下次查询的起点,类似于游标查询
GET my_results/_search
{
  "size": 10000,
  "sort": [
    {
      "scores": {
        "order": "asc"
      }
    }
  ],
  "_source": ["policyID", "username", "scores"]
}

# 第二次查询需要取到上回查询的最后的值作为search_after的值
GET my_results/_search
{
  "size": 10000,
  "sort": [
    {
      "scores": {
        "order": "asc"
      }
    }
  ],
  "_source": ["policyID", "username", "scores"],
  "search_after": [0.3798234]
}

这里需要注意,排序用的字段应该唯一,这样才能覆盖所有数据,如果有大量重复的字段值,如在某次查询中最后的值是 x1,不能保证按照 sort 排序的值是否还有重复,es 下次查询的时候会跳过该值 x1。

posted on 2024-03-08 10:26  进击的davis  阅读(17)  评论(0编辑  收藏  举报

导航