在預設情況下, elasticsearch 查詢返回前10條匹配的文件。
為了對大批量查詢結果分頁,最簡單方式是在查詢api中新增from和size引數,from表示需要返回的滿足查詢條件的數量,size表示查詢起始資料在全量結果集中的偏移量。
建立實驗索引:
put linked_blog}}
}}}}
get
/linked_blog/
default
/_search},
"from":3
,"size":2
}
預設情況下,使用from+size引數不能分頁查詢超過10,000
的文件。該限制可以通過索引設定index.max_result_window
更改。
深度分頁可能造成慢查詢。查詢結果在返回之前會被排序。但查詢通常會跨越多個分片,每個分片先自各執行查詢,並各自排序,再將各個分片查詢結果合併以保證最終查詢結果順序正確。
為了避免該問題,elasticsearch官方推薦使用scroll
或者search_after
替代from+size
實現分頁。
elasticsearch的查詢是分2個階段進行的,即query階段和fetch階段。 query階段比較輕量級,通過查詢倒排索引,獲取滿足查詢結果的文件id列表。 而fetch階段比較重,需要將每個shard的結果取回。
scroll查詢,先做輕量級的query階段以後,免去了繁重的全域性排序過程。 它只是將查詢結果集,也就是文件id列表保留在乙個上下文裡, 之後分批fetch。
scroll查詢方式類似於傳統資料庫的游標查詢和redis的scan查詢。如果使用過twitter開發者api會發現,這種方式和使用twitter開發者api獲取博文也很類似。
為了使用scroll,只需在首次分頁查詢時加上scroll引數,其值為該查詢上下文存活時間。例如:
get
/linked_blog/
default
/_search?scroll=1m}
,"size":3
}
上面的查詢結果中回包含_scroll_id
字段。
,"hits":}
,},}
]}}
後面的分頁使用scroll查詢,並帶上上次查詢結果的_scroll_id
字段。直到hits
陣列空,即表示所有資料查詢完成。
post
/_search/scroll
結果如下
,"hits":}
,},}
]}}
初次分頁和後面每次分頁均返回_scroll_id。 儘管_scroll_id在兩次請求之間可能會發生變化,但並非總是會發生變化。在任何情況下,都應使用最近收到的_scroll_id。
scroll 在首次分頁時就已經將所有滿足查詢條件的文件確定了,並忽略後續對這些文件的修改(可以理解,elasticsearch使用版本號區分修改)。並在首次分頁時,查詢上下文也已經建立了,在後續分頁中可以通過scroll_id 區分該查詢上下文,並使其保持存活狀態。
scroll 引數的值告訴elasticsearch 查詢上下文存活時間。該值並非處理所有分頁資料所需時間,而是處理當前頁所需時間,每次分頁都會重新設定查詢上下文過期時間。如果乙個scroll 請求沒有設定scroll 引數,則表示該查詢上下文將會被釋放。
使用如下介面,可以查詢每個節點開啟了多少scroll 查詢上下文。
get
/_nodes/stats/indices/search
scroll 查詢上下文在存活時間到達後會被自動刪除。因為scroll 查詢上下文需要消耗資源,所以當分頁結束或者不再需要分頁時,需要及時手動關閉。手動關閉api如下:
delete
/_search/scroll
關閉多個scroll 查詢上下文可用如下api:
delete
/_search/scroll
如下api可以清除所有scroll 查詢上下文:
delete
/_search/scroll/_all
Elasticsearch 分頁問題
1.form和size的方式 2.scroll api 3.search after引數 按照一般的查詢流程來說,如果我想查詢前10條資料 1 客戶端請求發給某個節點 2 節點 給個個分片,查詢每個分片上的前10條 3 結果返回給節點,整合資料,提取前10條 4 返回給請求客戶端 該分頁方式可以通過...
elasticsearch深度分頁索引
背景 es 深度分頁索引效率問題 1.常見深度分頁方式 from size es 預設採用的分頁方式是 from size 的形式,在深度分頁的情況下,這種使用方式效率是非常低的,比如 from 5000,size 10000,es 需要在各個分片上匹配排序並得到5000 10000條有效資料,然後...
ElasticSearch集群分頁式文件
1 路由 如圖所示 當我們想乙個集群儲存文件時,文件該儲存到哪個節點呢?是隨機嗎?是輪詢嗎?在elasticsearch中,會採用計算的方式來確定儲存到哪個節點,計算公式如下 shard hash routing number of primary shards這就是為什麼建立了主分片後,不能修改的...