作者:來自 Elastic?Benjamin Trent,?Mayya Sharipova,?Chenhui Wang?及?Libby Lin
了解我們如何通過更快的 float / half_float 排序和 integer 排序的延遲優化來加快 Elasticsearch 排序速度。
Elasticsearch 引入了大量新功能,幫助你為你的使用場景構建最佳搜索解決方案。深入了解我們的示例筆記本,開始免費云試用,或立即在本地機器上嘗試 Elastic。
Elasticsearch 在字段類型排序速度方面持續優化,9.0.1 版本已加速了 float / half_float 排序。此外,即將發布的 Elasticsearch 9.1 也將帶來 integer 排序的顯著延遲提升。
這些新的排序優化不僅已應用于 Elastic Cloud Serverless,也將回溯至 Elasticsearch 8.19,讓尚未升級到 Elasticsearch 9.x 的用戶也能享受排序性能提升。
通過兩個不同的基準測試,我們觀察到延遲顯著改善:
-
NYC Taxis 的 float 和 half_float 排序:提升 83 倍到 920 倍
-
Http_logs 的 integer 排序:提升 41 倍到 531 倍
在這里查看我們對 http_logs 的 nightly 基準測試結果(注意:2025 年 5 月新增了排序延遲指標)。
背景
在 2020 年,我們在 Elasticsearch 7.6 中對 long 和 date 字段類型的排序進行了重大優化。例如,按最新時間戳排序檢索日志的速度大幅提升。隨后在 7.16 版本中,我們引入了 search_after 參數,支持了常見的分頁場景。
這一次,我們將同樣的優化應用到 integer、short 和 byte 字段類型,以及 float 和 half_float 字段類型。
根據你的數據及其在各個 segment 之間的分布情況,你可能會看到對 integer、short、byte、float 和 half_float 數據類型進行排序查詢的速度提升從幾倍到數百倍不等。
我們是怎么做到的?
我們沒有依賴 index sorting,而是采用了一種新方法:將 BKD(Block k-dimensional)樹與 distance 查詢結合使用。BKD 樹的葉子塊具有便于跳過的特性,因為每個塊的字段最小值和最大值是可比較的。
結合使用 distance_feature 查詢,我們可以在比較過程中快速判斷哪些塊不具備競爭性,從而跳過這些無效的數據區域,大大節省處理時間。
至于是從全局最小值還是最大值計算距離,取決于排序是升序還是降序。
這也意味著字段必須已建立索引,且不能為 null。
更詳細的內容可以參考我們之前關于排序查詢優化的博客。
下面是結果……
結果
NYC Taxis 基準測試
在 NYC Taxis 基準測試中(添加了 half_float 類型),性能提升范圍為 83 倍到 920 倍(通過舊的 P90 延遲除以新的 P90 延遲計算得出):
從對數尺度的圖像上可以直觀看到顯著的提升:
Http_logs 基準測試
我們使用了開源工具 Rally 中的 http_logs track,采用了此處提供的默認設置。
在 integer 排序優化中,http_logs 基準測試的八種不同使用場景下,性能提升在 41 倍到 531 倍之間(同樣通過舊的 P90 延遲除以新的 P90 延遲計算得出)。
同樣,即使在對數尺度下,我們也能看到明顯的性能提升對比:
根據我們的 nightly 基準測試,integer 排序的性能提升非常顯著,結果如下復現:
許多用例都受益于這一性能提升,包括 Observability、Security 和 Search 中的分析儀表盤。更低的延遲也帶來了更高效的計算和更低的基礎設施成本。
展望 Elasticsearch 9.1
Elastic 9.1 還將包含其他令人興奮的改進,包括但不限于:
-
ES|QL 全文搜索(MATCH、QSTR、評分)正式版
-
線性檢索器(推進混合搜索)
-
HNSW 的 ACORN-1 性能提升
-
提前終止如何加速近似 KNN 搜索
我們致力于持續創新,幫助你構建最快的搜索應用。
原文:Elasticsearch sorting just got up to 900x faster - Elasticsearch Labs