如果一次性要查出來比如10萬條數據,那么性能會很差,此時一般會采取用scoll滾動查詢,一批一批的查,直到所有數據都查詢完處理完
使用scoll滾動搜索,可以先搜索一批數據,然后下次再搜索一批數據,以此類推,直到搜索出全部的數據來
scoll搜索會在第一次搜索的時候,保存一個當時的視圖快照,之后只會基於該舊的視圖快照提供數據搜索,如果這個期間數據變更,是不會讓用戶看到的
采用基於_doc進行排序的方式,性能較高
每次發送scroll請求,我們還需要指定一個scoll參數,指定一個時間窗口,每次搜索請求只要在這個時間窗口內能完成就可以了
GET /test_index/test_type/_search?scroll=1m
{
"query": {
"match_all": {}
},
"sort":["_doc"],
"size":3
}
//結果
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAABlEFlhIb1FOME82U3llb202bER1Zm95VkEAAAAAAAAZRRZYSG9RTjBPNlN5ZW9tNmxEdWZveVZBAAAAAAAAGUYWWEhvUU4wTzZTeWVvbTZsRHVmb3lWQQAAAAAAABlHFlhIb1FOME82U3llb202bER1Zm95VkEAAAAAAAAZSBZYSG9RTjBPNlN5ZW9tNmxEdWZveVZB",
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 10,
"max_score": null,
"hits": [
{
"_index": "test_index",
"_type": "test_type",
"_id": "AVsxkqabZ1jIX97EnDWz",
"_score": null,
"_source": {
"test_filed": "auto_id"
},
"sort": [
0
]
},
{
"_index": "test_index",
"_type": "test_type",
"_id": "12",
"_score": null,
"_source": {
"test_field": "test_12"
},
"sort": [
0
]
},
{
"_index": "test_index",
"_type": "test_type",
"_id": "2",
"_score": null,
"_source": {
"test_field": "test_test_external_vesion"
},
"sort": [
0
]
}
]
}
}
獲取的結果會有一個scroll__id,下次再發送scroll請求的時候,必須帶上這個scroll_id
GET /_search/scroll
{
"scroll":"1m",
"scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAABmIFlhIb1FOME82U3llb202bER1Zm95VkEAAAAAAAAZjBZYSG9RTjBPNlN5ZW9tNmxEdWZveVZBAAAAAAAAGYoWWEhvUU4wTzZTeWVvbTZsRHVmb3lWQQAAAAAAABmLFlhIb1FOME82U3llb202bER1Zm95VkEAAAAAAAAZiRZYSG9RTjBPNlN5ZW9tNmxEdWZveVZB"
}
</div>