[英]Elasticsearch Scroll
我對 Elasticsearch 的滾動功能有點困惑。 在 elasticsearch 中,每次用戶在結果集上滾動時是否都可以調用搜索 API? 從文檔
"search_type" => "scan", // use search_type=scan
"scroll" => "30s", // how long between scroll requests. should be small!
"size" => 50, // how many results *per shard* you want back
這是否意味着它將每 30 秒執行一次搜索並返回所有結果集,直到沒有記錄?
例如我的 ES 返回總共 500 條記錄。 我從 ES 獲取數據作為兩組記錄,每組記錄有 250 條記錄。 有什么辦法可以先顯示第一組 250 條記錄,當用戶滾動時再顯示第二組 250 條記錄。請建議
您正在尋找的是分頁。
您可以通過查詢固定大小並設置from
參數來實現您的目標。 由於要設置成250個結果的批量顯示,因此可以設置size = 250
並在每個連續查詢中將from
的值增加250
。
GET /_search?size=250 ---- return first 250 results
GET /_search?size=250&from=250 ---- next 250 results
GET /_search?size=250&from=500 ---- next 250 results
相反,“ Scan & scroll
使您可以通過一次搜索來檢索大量結果,並且理想地用於諸如將數據重新索引為新索引之類的操作。 不建議將其用於實時顯示搜索結果。
為了簡要說明“ Scan & scroll
,它的本質作用是掃描與掃描請求一起提供的查詢的索引,並返回scroll_id
。 可以將此scroll_id
傳遞給下一個滾動請求,以返回下一批結果。
考慮以下示例-
# Initialize the scroll
page = es.search(
index = 'yourIndex',
doc_type = 'yourType',
scroll = '2m',
search_type = 'scan',
size = 1000,
body = {
# Your query's body
}
)
sid = page['_scroll_id']
scroll_size = page['hits']['total']
# Start scrolling
while (scroll_size > 0):
print "Scrolling..."
page = es.scroll(scroll_id = sid, scroll = '2m')
# Update the scroll ID
sid = page['_scroll_id']
# Get the number of results that we returned in the last scroll
scroll_size = len(page['hits']['hits'])
print "scroll size: " + str(scroll_size)
# Do something with the obtained page
在上述示例中,發生了以下事件-
scroll_id
(在上一個滾動請求中接收到),並返回下一批結果。 您誤解了scroll
屬性的目的。 這並不意味着elasticsearch將在30秒后獲取下一頁數據。 在執行第一個滾動請求時,您需要指定何時關閉滾動上下文。 scroll
參數指示30秒后關閉滾動上下文。
在執行第一個滾動請求后,您將獲得響應的scroll_id
參數。 對於下一頁,您需要傳遞該值以獲得滾動響應的下一頁。 如果您將在30秒內不執行下一個滾動請求,則該滾動請求將被關閉,您將無法獲取該滾動請求的下一頁。
您作為示例用例描述的實際上是搜索結果分頁 ,它可用於任何搜索查詢,並且受到1萬個結果的限制。 如果您需要超過10k的限制,則需要scroll
請求,使用scroll
查詢甚至可以獲取整個文檔集合。
造成混淆的原因可能是scroll
術語含糊不清:它表示查詢的類型,並且也是此類查詢的參數名稱(如其他注釋中所述 ,這是ES會繼續等待您的時間)獲取下一個滾動塊)。
scroll
查詢很繁瑣,應避免使用,直到絕對必要為止。 實際上,在文檔中它說:
滾動不用於實時用戶請求,而是用於處理大量數據,...
現在關於另一個問題:
在Elasticsearch中,是否每當用戶滾動結果集時都可以調用搜索API?
是的,甚至可能有幾個並行滾動請求 :
每個滾動都是獨立的,可以像任何滾動請求一樣並行處理。
Scroll API的彈性文檔也解釋了此行為。
結果大小10k是默認值,可以在運行時覆蓋,如有必要:
PUT { "index" : { "max_result_window" : 500000} }
在每個滾動請求中使用參數“ scroll”定義滾動ID的生存時間,例如
..
"scroll" : "5m"
..
使用 scroll api 是明智的,因為在 elasticsearch 中一次不能獲得超過 10K 的數據。
在 Elasticsearch 的最新版本中,您將使用search_after 。 你在那里設置的keep_alive
,很像滾動中的timeout
,只是你處理一頁所需的時間。
那是因為 Elasticsearch 會在這段時間內讓您的“搜索上下文”保持活動狀態,然后將其刪除。 此外,Elasticsearch 不會自動為您獲取下一頁,您必須通過發送帶有上次請求中的 ID 的請求來實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.