es中的scan and scroll搜索

在es上搜索数据时,默认es只会返回10条文档,当我们想获取更多结果,或者只要结果中的一个区间的数据时,可以通过szie和from来指定。

GET /_search?size=3&from=20
如上的查询语句,会返回排序后的结果中第20到第22条数据。es在收到这样的一个请求之后,每一个分片都会返回一个top22的搜索结果,然后将这些结果汇总排序,再选出top22,最后取第20到第22条数据作为结果返回。


这样会带来一个问题,当我们搜索的时候,如果想取出第10001条数据,那么就相当于每个一分片都要对数据进行排序,取出前10001条文档,然后es再将这些结果汇总再次排序,之后取出第10001条数据。这样对于es来说就会产生相当大的资源和性能开销。如果我们不要求es对结果进行排序,那么就会消耗很少的资源,所以针对此种情况,es提供了scan and scroll的搜索方式。

GET /old_index/_search?search_type=scan&scroll=1m 
{
    "query": { "match_all": {}},
    "size":  1000
}
我们可以首先通过如上的请求发起一个搜索,但是这个请求不会返回任何文档,它会返回一个_scroll_id,接下来我们再通过这个id来从es中读取数据:

GET /_search/scroll?scroll=1m 
c2Nhbjs1OzExODpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExOTpRNV9aY1VyUVM4U0 
NMd2pjWlJ3YWlBOzExNjpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNzpRNV9aY1Vy
UVM4U0NMd2pjWlJ3YWlBOzEyMDpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzE7dG90YW
xfaGl0czoxOw==
此时除了会返回搜索结果以外,还会再次返回一个_scroll_id,当我们下次继续取数据时,需要用最新的id。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值