ElasticSearch 使用 Composite Aggregation 實(shí)現(xiàn)桶的分頁查詢功能
官方文檔
概述
當(dāng)需要分頁查詢大量的桶時(shí)composite 聚合可以通過分頁的方式逐步獲取桶結(jié)果,避免一次性返回大量的桶 。
與傳統(tǒng)分頁方法不同,composite aggregation
并不基于結(jié)果的偏移量(offset),而是基于聚合桶的游標(biāo)機(jī)制來實(shí)現(xiàn)分頁,從而避免了性能瓶頸。
Composite Aggregation 概述
composite aggregation
是 Elasticsearch 中的一種特殊聚合方式,適用于需要分頁展示的聚合結(jié)果。它與傳統(tǒng)的聚合方式不同,采用了基于游標(biāo)的分頁模型。composite aggregation
不依賴 from
和 size
來進(jìn)行分頁,而是通過 after
參數(shù)來指定從某個(gè)特定桶之后開始返回?cái)?shù)據(jù),從而實(shí)現(xiàn)分頁。
示例:基本分頁查詢
假設(shè)我們有一個(gè)索引,名稱為 your_index_name
,其中包含多個(gè)文檔,每個(gè)文檔都有一個(gè)字段 your_field_name
。我們希望根據(jù)這個(gè)字段進(jìn)行分頁查詢,并且每次返回 10 個(gè)聚合結(jié)果。
以下是一個(gè)基礎(chǔ)的分頁查詢示例:
GET /your_index_name/_search { "size": 0, "aggs": { "my_composite_agg": { "composite": { "size": 10, "sources": [ { "my_terms_agg": { "terms": { "field": "your_field_name" } } } ] } } } }
size
設(shè)置為 0:由于我們使用的是聚合查詢,而非文檔查詢,所以不需要返回文檔內(nèi)容。size: 0
意味著查詢結(jié)果中不會包含文檔,只會返回聚合的結(jié)果。composite
聚合:這是我們實(shí)現(xiàn)分頁的關(guān)鍵。composite
聚合會根據(jù)指定的聚合方式返回一個(gè)分頁的桶(bucket)結(jié)果。每個(gè)桶代表了根據(jù)your_field_name
字段分組后的數(shù)據(jù)。size: 10
:表示每次返回 10 個(gè)桶,即每頁 10 條聚合結(jié)果。sources
:這是定義如何分組數(shù)據(jù)的部分。這里,我們使用了terms
聚合,根據(jù)your_field_name
字段的值對文檔進(jìn)行分組。
分頁:獲取下一頁結(jié)果
要實(shí)現(xiàn)分頁,我們需要使用 after
參數(shù)來指示從哪個(gè)位置開始返回?cái)?shù)據(jù)。這個(gè)參數(shù)的值是上一個(gè)查詢返回的最后一個(gè)桶的 key
值。
下面是如何獲取第二頁結(jié)果的示例:
GET /your_index_name/_search { "size": 0, "aggs": { "my_composite_agg": { "composite": { "size": 10, "after": ["bucket_key_from_first_page"], // 第一頁的最后一個(gè)桶的key值 "sources": [ { "my_terms_agg": { "terms": { "field": "your_field_name" } } } ] } } } }
after
參數(shù):這是實(shí)現(xiàn)分頁的關(guān)鍵,after
參數(shù)的值應(yīng)該是上一頁結(jié)果的最后一個(gè)桶的key
值(可以通過上一頁查詢結(jié)果中的after_key
獲?。?。after
參數(shù)告訴 Elasticsearch 從哪個(gè)位置開始返回?cái)?shù)據(jù),從而實(shí)現(xiàn)分頁。- 獲取
after_key
:在每次查詢的返回結(jié)果中,除了聚合的結(jié)果之外,還可以看到一個(gè)after_key
字段,這個(gè)字段就是下一次分頁查詢所需要使用的after
參數(shù)的值。
例如,假設(shè)第一次查詢的返回結(jié)果包含以下聚合信息:
{ "aggregations": { "my_composite_agg": { "buckets": [ { "key": { "your_field_name": "value1" }, "doc_count": 10 }, { "key": { "your_field_name": "value2" }, "doc_count": 15 }, // ... 更多桶 ], "after_key": { "your_field_name": "value2" } } } }
在第二次分頁查詢時(shí),我們需要使用 after_key
中的 your_field_name: "value2"
作為 after
參數(shù)的值,以此來獲取下一頁的結(jié)果。
官方案例
GET /_search { "size": 0, "aggs": { "my_buckets": { "composite": { "size": 2, "sources": [ { "date": { "date_histogram": { "field": "timestamp", "calendar_interval": "1d" } } }, { "product": { "terms": { "field": "product" } } } ] } } } }
返回
{ ... "aggregations": { "my_buckets": { "after_key": { "date": 1494288000000, "product": "mad max" }, "buckets": [ { "key": { "date": 1494201600000, "product": "rocky" }, "doc_count": 1 }, { "key": { "date": 1494288000000, "product": "mad max" }, "doc_count": 2 } ] } } }
下次查詢
GET /_search { "size": 0, "aggs": { "my_buckets": { "composite": { "size": 2, "sources": [ { "date": { "date_histogram": { "field": "timestamp", "calendar_interval": "1d", "order": "desc" } } }, { "product": { "terms": { "field": "product", "order": "asc" } } } ], "after": { "date": 1494288000000, "product": "mad max" } } } } }
使用場景
composite aggregation
非常適用于以下場景:
- 大量數(shù)據(jù)分頁:當(dāng)桶數(shù)據(jù)量非常大時(shí),使用
composite aggregation
可以避免偏移的性能開銷。 - 基于字段的分組分頁:如果需要對某個(gè)字段進(jìn)行分組并進(jìn)行分頁,
composite aggregation
是最合適的方式。 - 避免數(shù)據(jù)丟失:使用傳統(tǒng)分頁方法時(shí),由于數(shù)據(jù)的變動可能導(dǎo)致查詢結(jié)果發(fā)生偏移,從而可能出現(xiàn)重復(fù)或遺漏的情況。
composite aggregation
通過游標(biāo)機(jī)制避免了這個(gè)問題。
注意事項(xiàng)
after
參數(shù)的類型:after
參數(shù)的值類型與sources
中定義的聚合字段類型保持一致。例如,如果你的字段是字符串類型,那么after
參數(shù)應(yīng)該是字符串類型;如果是數(shù)字類型,那么應(yīng)該是數(shù)字類型。- 分頁的順序:
composite aggregation
是基于聚合桶的游標(biāo)來分頁的,因此分頁的順序依賴于聚合字段的值排序。如果數(shù)據(jù)分布不均,可能會導(dǎo)致每頁的桶數(shù)不一致。 - 限制聚合桶數(shù):雖然可以通過
size
參數(shù)控制每頁的結(jié)果數(shù),但需要注意的是,composite aggregation
每次最多只會返回 10,000 個(gè)桶。如果你的分頁范圍超過這個(gè)數(shù)量,可能需要對數(shù)據(jù)進(jìn)行分片或者其他優(yōu)化。
到此這篇關(guān)于ElasticSearch 使用 Composite Aggregation 實(shí)現(xiàn)桶的分頁查詢的文章就介紹到這了,更多相關(guān)ElasticSearch 使用 Composite Aggregation內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
XXencode 編碼,XX編碼介紹、XXencode編碼轉(zhuǎn)換原理與算法
這篇文章主要介紹了XXencode 編碼,XX編碼介紹、XXencode編碼轉(zhuǎn)換原理、算法,需要的朋友可以參考下2016-06-06http請求405錯(cuò)誤方法不被允許的解決 (Method not allowed)
這篇文章主要介紹了http請求405錯(cuò)誤方法不被允許的解決 (Method not allowed),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12git_stats?web代碼圖形統(tǒng)計(jì)工具詳解
倉庫代碼統(tǒng)計(jì)工具之一,可以按git提交人、提交次數(shù)、修改文件數(shù)、代碼行數(shù)、注釋量在時(shí)間維度上進(jìn)行統(tǒng)計(jì),亦可按各文件類型進(jìn)行簡單的統(tǒng)計(jì),非常方便.本文給大家介紹git_stats?web代碼圖形統(tǒng)計(jì)工具,需要的朋友參考下吧2021-12-12支付寶 接口開發(fā)幫助(asp,php,asp.net,jsp)
支付寶的接口開發(fā)使用的技術(shù)含量并不高!因?yàn)槭褂玫氖荋TTP普通GET和Post方式傳遞數(shù)據(jù),而這些數(shù)據(jù)是傳給您的程序由您的程序任意處理和支付寶服務(wù)器處理,所以重點(diǎn)在再流程和傳參!2009-06-06MobaXterm遠(yuǎn)程登錄工具功能與應(yīng)用小結(jié)
MobaXterm是一款功能強(qiáng)大的遠(yuǎn)程終端軟件,主要支持SSH登錄,擁有多種遠(yuǎn)程協(xié)議,實(shí)現(xiàn)跨平臺訪問,它包括多會話管理、本地命令行執(zhí)行、圖形化界面集成和文件傳輸?shù)裙δ?提供豐富的自定義選項(xiàng)和安全特性,感興趣的朋友一起看看吧2025-02-02Git基礎(chǔ)之git在項(xiàng)目中的協(xié)作模式
這篇文章主要為大家介紹了Git基礎(chǔ)之git在項(xiàng)目中的協(xié)作模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04詳解git submodule使用以及注意事項(xiàng)
這篇文章主要介紹了詳解git submodule使用以及注意事項(xiàng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Windows環(huán)境下實(shí)現(xiàn)Jenkins部署的教程詳解
這篇文章主要介紹了Windows環(huán)境下實(shí)現(xiàn)Jenkins部署,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01