簡體   English   中英

彈性搜索滾動

[英]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_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM