我們可以使用from +size來獲取所有數據,但是,如果數據量大的時候,這樣的操作開銷很大,這時候可以使用scroll操作
1.第一步發起一個scroll 的post請求,帶上參數scroll=1m (1m的意思是1分鍾的意思)
POST /twitter/_search?scroll=1m { "size": 100, "query": { "match" : { "title" : "elasticsearch" } } }
這一步會得到一個_scroll_id
2. 使用第一步得到的_scroll_id 來翻頁,一直執行這個請求,就可以得到所有的數據了
POST /_search/scroll { "scroll" : "1m", "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAA3okgWbkYzT1lBcjRUS0NmbkRnclY3bElmUQ==" }
注意:
1. 如果想加快索引,第一步加上sort選項, 有些文章會說使用 search_type=scan ,但這個選項是要es 2.1版本之前才有用,之后的版本就被棄用了,改成sort選項了
GET /_search?scroll=1m { "sort": [ "_doc" ] }

2.scroll參數說明,這個表示_scroll_id的有效期有多久,如果超過這個有效期,那再去翻頁就會得到404 error,並且每次翻頁都會重置有效期,所以這個有效期只需要大於前后兩次翻頁的時間(也就是你處理一頁數據的時間)

3. scrapy去請求翻頁,很有可能因為_scroll_id沒有變化,造成請求重復而被放棄,一定要加上dont_filter=True
4.我在做這個測試的時候,發現window測試電腦用外網地址去請求centos服務器的ES數據很慢,而用內網中的linux計算機去請求同樣的服務器數據,時間快了20倍
參考
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/breaking_50_search_changes.html