结合 32 课,继续讨论关于优化查询效率的问题,上个课时中我们使用 es.search(dsl,index)
接口查询出了北京城市的所有天气数据,即使我们使用了 _source 字段控制了不必要的网络输出,但是我们是一次性把北京城市的数据全部都取回来了,并且使用 value_cout 字段统计了有多少条数据,然后设置 size,这里因为 size 比较小,没超过 10000 条,但是如果是上百万条呢?通过 value_cout 获取数据个数,然后再设置 size 一次性取回来吗?
当然是不允许了,无法再划分的取数据需求,我们可以分批取回所有数据,那就是 Scroll 接口。
ES 优化 Scroll
指定 index,指定 DSL,配置 Scroll 有效时间是 2 分钟,每次取 1000 个。关于 Scroll 原理之前的课时也介绍的很清楚了,就是会在 ES 里面生成一个数据快照,Scroll 会直接从这个快照里面取,快照不能够避免脏数据,因为不能够跟 ES 索引保持实时一致,如果数据快照已经生成,ES 索引数据发生改变,那么这更新后的 ES 数据是不会同步到数据快照中的。
data=es.search(index=index,body=dsl,scroll='2m'