elastic search在普通方式查詢時會返回記錄總數以及開頭的若干條,即便指定from和相應的長度size也有總數限制。根據文檔介紹,這時需要通過scroll分頁查詢,在初次查詢時指定改方式,之后不斷的調用scroll方法針對同_scroll_id會得到后續數據。就像通過一個固定的游標以及指定的窗口大小來不斷滾動獲得新的數據。
from elasticsearch import Elasticsearchif __name__ == '__main__': es =elasticSearch('elk.dev') page = es.search(index='PRod_nginx_20170211', _source=['localtime', 'request'], scroll='2m', size=10) sid = page['_scroll_id'] page_size = page['hits']['total'] for i in range(page_size//10 + 1): res = es.scroll(scroll_id = sid) for doc in res['hits']['hits']: print(doc['_source']['localtime'] + '---->' + doc['_source']['request']) print("===================================/n")結果: 腳本執行總是在刷出30條記錄后報錯。”elasticsearch.exceptions.NotFoundError: TransportError(404, ‘search_phase_execution_exception’, ‘No search context found for id [874876]’)” pub單步調試時,也是在30條后,再次執行res = es.scroll(scroll_id=sid)時報404錯誤。(未解)
在群里以及文檔中介紹的提示,scroll查詢時也可能會改變scroll_id值,所以每次查詢時需要使用最新的scroll_id。但測試發現從elasticsearch.scroll方法返回的結果中并沒有scroll_id值。 換另一種調用方式,在kibana中直接GET:
## 先初次查詢指定scroll GET /prod_nginx_20170211/_search?scroll=1m&size=100{ "_source": ["localtime", "request"]}## 調用scrollGET /_search/scroll{ "scroll": "1m", "scroll_id": "DnF1ZXJ5VGhlbkZldGNoAwAAAAAADaFSFlh6SG0xQmYxU2JXNm1sLXRZNFFCZ1EAAAAAAA2hVBZYekhtMUJmMVNiVzZtbC10WTRRQmdRAAAAAAANoVMWWHpIbTFCZjFTYlc2bWwtdFk0UUJnUQ=="}## 后續查詢時,使用返回結果中最新的scroll_id更新上面的再次查詢(PS:20170213)新聞熱點
疑難解答