#### 1.Elasticsearch是數據庫,不是普通的Java應用程序,傳統數據庫需要的硬件資源同樣需要,提升性能最有效的就是升級硬件。
#### 2.Elasticsearch是文檔型數據庫,不是關系型數據庫,不具備嚴格的ACID事務特性,任何企圖直接替代嚴格事務性場景的應用項目都會失敗!!!
##### 索引字段與屬性都屬于靜態設置,若后期變更歷史數據需要重建索引才可生效
##### 對歷史數據無效!!!!
##### 一定要重建索引!!!!
### 1、分頁查詢原理概要
## 分頁查詢需求
# 分頁需求海量數據:動輒數據量千萬級別、億級別,無法在一頁內展示
# 數據排序:查詢數據需要排序,按順序展示
## 分頁查詢過程
# 按條件掃描數據
# 按條件排列數據
# 取回數據
## ES分片查詢階段
# ES是分布式的,相比傳統數據庫多了分片機制,查詢一次,要查詢多個分片;
# 分頁查詢相比傳統數據庫增加了復雜度。
## ES分片合并階段
# 服務端協調節點從各分片取回數據ID按照條件排序合并得到最終的數據ID列表
## 分頁查詢問題
# 分頁查詢大小,決定了查詢的響應
# 分頁查詢深度,決定了查詢的效率
# 分頁查詢體驗,決定了魚與熊掌兼得
## 查詢便利
# 查詢優點
# 查詢數據時,可同時返回數據量總條數與分頁的明細數據;避免了傳統數據庫查詢2次的問題,大大提升了查詢效率
## 數據準備
POST _reindex
{"source": {"index": "kibana_sample_data_logs"},"dest": {"index": "kibana_sample_data_logs_page"}
}
## From Size查詢
# 起始頁查詢介紹
# from:設定起始數據位置
# size:設定單頁數據量大小
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":10,"size":20
}
## 查詢限制
# 查詢窗口大小限制
# From+size<=10000,默認不能超過此值,es的安全限制,會報錯
# Window=10000,重排序窗口不能超過此值
# 查詢超過10000的語句,報錯
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":10000,"size":20
}
## 但是實際場景中還是會有深分頁需求,可以通過修改配置實現
# 修改索引配置
PUT kibana_sample_data_logs_page/_settings
{"index":{"max_result_window":20000}
}
# 再次查詢,不報錯了
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":10000,"size":20
}
## 單頁大小設置
# 單頁大小
# Size設置多大合適,不同的大小性能不一
# _source控制在1kb以內
# 每次查詢返回數據控制在1M以內
# 盡量不要深分頁和大頁數
# 分片數也不要過多,請求會分發到所有分片在做聚合
### 3、Search After查詢實戰
## 參照點分頁查詢
# 概念介紹
# Search after,基于排序字段,查詢下一頁,基于上一頁最后一條數據的排序字段值,作為參照可以保證數據查詢量大大減少
## 注意事項
# 1.分頁會導致數據跳躍
# 2.數據新增或者變更refresh造成錯誤
# 查詢根據timestamp 倒序,使用的數據離散度要高,否則容易跳頁
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":0,"size":20,"query":{"match_all": {}},"sort":{"timestamp":{"order":"desc"}}
}
# 跳過第一條數據的sort值,原第二條數據變成了現在的第一條
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":0,"size":20,"query":{"match_all": {}},"sort":{"timestamp":{"order":"desc"}},// 跳過第一條數據的sort值"search_after":["1721339126749"]
}
# 查詢數據離散度低的排序跳頁
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":0,"size":20,"query":{"term": {"response": {"value": "200"}}}
}
# 跳過200沒有數據了
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":0,"size":20,"query":{"match_all": {}},"sort":[{"response":{"order":"desc"}}],// 跳過第一條數據的sort值"search_after":["200"]
}
# 可以使用多個字段排序,方式跳頁
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":0,"size":20,"query":{"match_all": {}},"sort":[{"response":{"order":"desc"}},{"timestamp":{"order":"desc"}}],// 跳過第一條數據的sort值"search_after":["200","1721339126749"]
}
## search_after 與 from 一起使用會報錯,不支持
GET kibana_sample_data_logs_page/_search
{"track_total_hits":true,"from":10,"size":20,"query":{"match_all": {}},"sort":[{"response":{"order":"desc"}}],// 跳過第一條數據的sort值"search_after":["200"]
}
### 4、Point in time查詢實戰
## Point in time查詢
# 概念介紹
# Search after,基于排序字段,查詢下一頁,基于上一頁最后一條數據的排序字段值,作為參照,可以保證數據查詢量大大減少
# 注意事項
# 1.分頁會導致數據跳躍
# 2.數據新增或者變更refresh造成錯誤
# 業務上數據是在不停的新增的,找不到原來的數據,這里相當于一個快照
# 生成分鐘的快照
POST kibana_sample_data_logs_page/_pit?keep_alive=1m
# 使用pit id查詢,不能顯示的指定索引名稱,因為pit中帶了索引信息
GET _search
{"track_total_hits":true,"from":10,"size":20,"query":{"match_all": {}},"pit":{"id": "i_vrAwEca2liYW5hX3NhbXBsZV9kYXRhX2xvZ3NfcGFnZRZ0MnRXYnZrc1RacWdoUjJBWFdpazJ3ABZDZnVtY0x0QlI0Ry13VUNoZ3BwOU53AAAAAAAABazOFkNtYjBkU0E5VGF5Q3hBOFJuMHh6QVEAARZ0MnRXYnZrc1RacWdoUjJBWFdpazJ3AAA="},"sort":[{"timestamp":{"order":"desc"}}]
}
### 5、Search Scroll 查詢實戰
## scroll快照查詢
# 概念解釋
# 快照查詢基于緩存機制,將查詢的所有數據ID緩存起來,下次查詢,從緩存中直接找尋,避免重復執行查詢,是目前業界做深度查詢最佳的方式;
# 注意事項
# 局限性也明顯,實時性支持弱;
# 不支持修改頁數,不支持跳頁
# 占用內存,使用完要清理掉
# 查詢條件,并生成1分鐘的快照
# 同時預設查詢條數和條件
POST kibana_sample_data_logs_page/_search?scroll=1m
{"track_total_hits":true,// 預設每次查100條"size":100,// 預設查詢條件"query":{"term": {"response": {"value": "503"}}}
}
# 使用scroll id查詢,不能顯示的指定索引名稱,因為scroll id中帶了索引信息和條件
# 數據一共有441條,查詢5次就沒結果了
GET _search/scroll
{"scroll_id":"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFkNtYjBkU0E5VGF5Q3hBOFJuMHh6QVEAAAAAAAY4TRZDZnVtY0x0QlI0Ry13VUNoZ3BwOU53","scroll":"1m"
}
### 6、分頁查詢建議與經驗分享
# 技術盡量滿足業務需求
# 技術不能無限制滿足業務
# 平衡業務與技術
# 深度翻頁真的需要這么多嗎?有十萬條數據的時候,真是場景下用戶不會每頁100條翻到最后一頁
# 分頁性能問題?from和size,size大了性能就不會高,數據量大了從es取出來快,但是帶寬不行
??
# 查詢DSL語法
# https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-search.html
# 分?查詢
# https://www.elastic.co/guide/en/elasticsearch/reference/7.11/paginate-search-results.html
# scroll-api
# https://www.elastic.co/guide/en/elasticsearch/reference/7.11/scroll-api.html
# point-in-time-api
# https://www.elastic.co/guide/en/elasticsearch/reference/7.11/point-in-time-api.html
# # time-units 時間參數
# https://www.elastic.co/guide/en/elasticsearch/reference/7.11/common-options.html#time-units