elasticsearch核心知識--30.分頁搜尋以及deep paging效能問題深度理解和es中聚合aggregation的分組可能結果不準確的原因
如何使用es進行分頁搜尋的語法 [size,from]
GET /_search?size=10
GET /_search?size=10&from=0
GET /_search?size=10&from=20
GET /test_index/test_type/_search
"hits": {
"total": 9,
"max_score": 1,
我們假設將這9條資料分成3頁,每一頁是3條資料,來實驗一下這個分頁搜尋的效果
GET /test_index/test_type/_search?from=0&size=3
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 9,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "test_type",
"_id": "8",
"_score": 1,
"_source": {
"test_field": "test client 2"
}
},
{
"_index": "test_index",
"_type": "test_type",
"_id": "6",
"_score": 1,
"_source": {
"test_field": "tes test"
}
},
{
"_index": "test_index",
"_type": "test_type",
"_id": "4",
"_score": 1,
"_source": {
"test_field": "test4"
}
}
]
}
}
第一頁:id=8,6,4
GET /test_index/test_type/_search?from=3&size=3
第二頁:id=2,自動生成,7
GET /test_index/test_type/_search?from=6&size=3
第三頁:id=1,11,3
##########重要::什麼是deep paging問題?
deep paging效能問題,以及原理深度。
1.必須1頁10條,當我們取第1000頁時,在es底層也是需要在每個分片【不限主備shard】取出滿足條件的 10010條資料,
如果三個shard ,那麼總共在coordination中會load出10010*3=30030條資料,進行排序。然後取出對應的1000頁的10條資料。儘量避免深度分頁,因為會出現消耗大量的IO 記憶體 cpu,已經會頻繁出現gc。
2.想到了es的aggregation的聚合分組, 如果原始資料中存在10個組,只需要查詢統計出三個組。那麼會出現資料不準確的問題. 因為會去每個分片中進行分組統計,每個分片中前TopN=Top3會出現 被收集到coordination中 ,再進行聚合排序。再取出前三個組的統計結果。但是可能在每個分片查詢時,最終的TopN的資料,排名在3名以上,那麼那部分的資料不會被統計進來。所以對aggregation的分組 如果想資料完全正確,要麼是單shard的索引。要麼時查處全部的分組後,在取前TopN的分組進行統計。