在使用Elasticsearch时,如果要返回少量的数据,我们可以在DSL语句中指定size这个参数来设定返回多少条数据:
{ ...其他查询条件... "size": 1000 }
然而,如果你要查询极其大量的数据,例如10亿条,那么这种方式就不实用了。因为在默认情况下, size
参数和 from
参数之和不能超过10000,即使你修改了Elasticsearch的配置,提高了这个和的上限,也不可能无休止得把它加大。所以在查询极大量数据时,需要使用 scroll
关键字来实现。
当我们使用Python + elasticsearch-py来读取Elasticsearch时,可以这样使用scroll:
body = {'你的DSL语句'} res = es.search(index='index', body=body, scroll='2m') sid = res['_scroll_id'] scroll_size = len(res['hits']['hits']) process_hit(res['hits']['hits']) while scroll_size > 0: data = es.scroll(scroll_id=sid, scroll='2m') process_hit(data['hits']['hits']) sid = data['_scroll_id'] scroll_size = len(data['hits']['hits'])
其中, process_hit
用于处理当前这一批的数据。scroll参数的值 2m
表示2分钟。
这种做法的原理,实际上就是每次读取若干条(通过DSL中的 size
关键字设定),分多次读取,直到读完为止。后一次读的时候,从前一次返回的 _scroll_id
对应的id开始读。这样每一次读取的结果就可以接在一起了。当某一次读取的结果为空时,说明已经把所有数据全部读完了,就可以停止了。