elasticsearch深度分頁索引

2021-09-24 04:59:49 字數 2467 閱讀 1623

背景:es 深度分頁索引效率問題

1.常見深度分頁方式 from+size

es 預設採用的分頁方式是 from+ size 的形式,在深度分頁的情況下,這種使用方式效率是非常低的,比如

from = 5000, size=10000, es 需要在各個分片上匹配排序並得到5000*10000條有效資料,然後在結果集中取最後10000條

資料返回.

除了效率上的問題,還有乙個無法解決的問題是,es 目前支援最大的 skip 值是 max_result_window ,預設

為  10000。也就是當 from + size > max_result_window 時,es 將返回錯誤.

當然,我們可以採用緊急規避方案,就是調整 max_result_window 的值。

curl -xput "127.0.0.1:9200/custm/_settings" -d ' }'

然後這種方式只能暫時解決問題,當es 的使用越來越多,資料量越來越大,深度分頁的場景越來越複雜時,如何解決這種問題呢?

2.scroll 分頁方式

為了滿足深度分頁的場景,es 提供了 scroll 的方式進行分頁讀取。原理上是對某次查詢生成乙個游標 scroll_id , 後續的查詢只需要根據這個游標去取資料,直到結果集中返回的 hits 欄位為空,就表示遍歷結束。

scroll_id 的生成可以理解為建立了乙個臨時的歷史快照,在此之後的增刪改查等操作不會影響到這個快照的結果。

1.先獲取第乙個 scroll_id,url 引數包括 /index/_type/ 和 scroll,scroll 字段指定了scroll_id 的有效生存期,以分鐘為單位,過期之後會被es 自動清理。

curl -xget 127.0.0.1:9200/db/info/_search?pretty&scroll=2m -d '}, "sort": ["_doc"]}'

curl -xget '127.0.0.1:9200/_search/scroll?scroll=1m&scroll_id=cxdferdgd45wesdfd35dfefdfx2znoza

刪除掉所有索引上的 scroll_id    curl -xdelete 127.0.0.1:9200/_search/scroll/_all

刪掉指定的多個  srcoll_id           curl -xdelete 127.0.0.1:9200/_search/scroll -d ''

3.search_after 的方式

上述的 scroll search 的方式,官方的建議並不是用於實時的請求,因為每乙個 scroll_id 不僅會占用大量的資源(特別是排序的請求),而且是生成的歷史快照,對於資料的變更不會反映到快照上。這種方式往往用於非實時處理大量資料的情況,比如要進行資料遷移或者索引變更之類的。那麼在實時情況下如果處理深度分頁的問題呢?es 給出了 search_after 的方式,這是在 >= 5.0 版本才提供的功能。

為了找到每一頁最後一條資料,每個文件必須有乙個全域性唯一值,這種分頁方式其實和目前 moa 記憶體中使用rbtree 分頁的原理一樣,官方推薦使用 _uid 作為全域性唯一值,其實使用業務層的 id 也可以。

第一頁的請求和正常的請求一樣

curl -xget 127.0.0.1:9200/db/info/_search

curl -xget 127.0.0.1:9200/order/info/_search

},"search_after": [1463533345, "2039488283-alt"],

"sort": [,]

}備註:參考: 這篇文章提到,使用search_after 方式時,必須要設定from=0。

search_after 深分頁

scroll 的方式,官方的建議不用於實時的請求(一般用於資料匯出),因為每乙個 scroll_id 不僅會占用大量的資源,而且會生成歷史快照,對於資料的變更不會反映到快照上。

為了找到每一頁最後一條資料,每個文件必須有乙個全域性唯一值,官方推薦使用 _uid 作為全域性唯一值,其實使用業務層的 id 也可以。

get test_dev/_search}]

}},

"size": 20,

"from": 0,

"sort": [

,"_id":

}]}

使用search_after必須要設定from=0。

這裡我使用timestamp和_id作為唯一值排序。

我們在返回的最後一條資料裡拿到sort屬性的值傳入到search_after。

get test_dev/_search}]

}},

"size": 10,

"from": 0,

"search_after": [

1541495312521,

"d0xh6gybbtbwbqsp0j1a"

],"sort": [

,"_id":

}]}

elasticsearch配置詳解

elasticsearch的config資料夾裡面有兩個配置檔案 elasticsearch.yml和logging.yml,第乙個是es的基本配置檔案,第二個是日誌配置檔案,es也是使用log4j來記錄日誌的,所以logging.yml裡的設定按普通log4j配置檔案來設定就行了。下面主要講解下e...

誰在使用Elasticsearch

github github使用elasticsearch搜尋20tb的資料,包括13億的檔案和1300億行的 這個不用介紹了吧,碼農們都懂的,github在2013年1月公升級了他們的 搜尋,由solr轉為elasticsearch,目前集群規模為26個索引儲存節點和8個客戶端節點 負責處理搜尋請求...

elasticsearch配置說明

elasticsearch.yml是elasticsearch主要的配置檔案,所有的配置都在這個檔案裡完成,一般情況下,預設的配置已經可以比較好地執行乙個集群了,但你也可以對其進行微調。在環境變數中的引數可以用來作為配置引數的值,比如配置檔案裡舉的乙個例子為 node.rack 再比如 等。下面對其...