游标查询

scroll查询,可以用于对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价。scroll查询可以分为以下两个步骤。

启动游标查询

GET /host/_search?scroll=1m

其中的scroll=1m表示游标查询窗口保持1分钟,如果一次取的数据量大可以设置为一个大一些的时间。
返回的字段中包含一个scroll_id, 接下来用这个字段可以获取后续值。

循环获取

循环获取余下的值

GET /_search/scroll{    "scroll": "1m",     "scroll_id" : scroll_id}

通过上一步得到的scroll_id,获取余下的值。

完整代码

用Python获取所有数据的完整代码如下

def get_all_es_data(url):    # 过滤的query    query = {}    data = []    # 每次取的数据量    size = 10000    scroll_id = None    try:        while size == 10000:            if not scroll_id:                query["size"] = 10000                curr_url = url + '/_search?scroll=8m'                response = requests.post(curr_url, json.dumps(query), headers={'content-type': 'application/json'})            else:                curr_url = url + '_search/scroll?scroll=8m&scroll_id=' + scroll_id                response = requests.get(curr_url)            if response:                response = json.loads(response.text)                scroll_id = response['_scroll_id']                response_data = [doc["_source"] for doc in response['hits']['hits']]                data.extend(response_data)    except Exception as err:        pass