欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ElasticSearch 使用 Composite Aggregation 實(shí)現(xiàn)桶的分頁查詢功能

 更新時(shí)間:2024年12月12日 14:13:43   作者:小小工匠  
composite aggregation 是 Elasticsearch 中的一種特殊聚合方式,適用于需要分頁展示的聚合結(jié)果,本文給大家介紹ElasticSearch 使用 Composite Aggregation 實(shí)現(xiàn)桶的分頁查詢,感興趣的朋友一起看看吧

官方文檔

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html#_pagination

概述

當(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 不依賴 fromsize 來進(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)換原理與算法

    這篇文章主要介紹了XXencode 編碼,XX編碼介紹、XXencode編碼轉(zhuǎn)換原理、算法,需要的朋友可以參考下
    2016-06-06
  • http請求405錯(cuò)誤方法不被允許的解決 (Method not allowed)

    http請求405錯(cuò)誤方法不被允許的解決 (Method not allowed)

    這篇文章主要介紹了http請求405錯(cuò)誤方法不被允許的解決 (Method not allowed),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • git_stats?web代碼圖形統(tǒng)計(jì)工具詳解

    git_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ā)幫助(asp,php,asp.net,jsp)

    支付寶的接口開發(fā)使用的技術(shù)含量并不高!因?yàn)槭褂玫氖荋TTP普通GET和Post方式傳遞數(shù)據(jù),而這些數(shù)據(jù)是傳給您的程序由您的程序任意處理和支付寶服務(wù)器處理,所以重點(diǎn)在再流程和傳參!
    2009-06-06
  • MobaXterm遠(yuǎn)程登錄工具功能與應(yīng)用小結(jié)

    MobaXterm遠(yuǎn)程登錄工具功能與應(yīng)用小結(jié)

    MobaXterm是一款功能強(qiáng)大的遠(yuǎn)程終端軟件,主要支持SSH登錄,擁有多種遠(yuǎn)程協(xié)議,實(shí)現(xiàn)跨平臺訪問,它包括多會話管理、本地命令行執(zhí)行、圖形化界面集成和文件傳輸?shù)裙δ?提供豐富的自定義選項(xiàng)和安全特性,感興趣的朋友一起看看吧
    2025-02-02
  • Git基礎(chǔ)之git在項(xiàng)目中的協(xié)作模式

    Git基礎(chǔ)之git在項(xiàng)目中的協(xié)作模式

    這篇文章主要為大家介紹了Git基礎(chǔ)之git在項(xiàng)目中的協(xié)作模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 詳解git submodule使用以及注意事項(xiàng)

    詳解git submodule使用以及注意事項(xiàng)

    這篇文章主要介紹了詳解git submodule使用以及注意事項(xiàng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Windows環(huán)境下實(shí)現(xiàn)Jenkins部署的教程詳解

    Windows環(huán)境下實(shí)現(xiàn)Jenkins部署的教程詳解

    這篇文章主要介紹了Windows環(huán)境下實(shí)現(xiàn)Jenkins部署,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Hadoop分布式集群的搭建的方法步驟

    Hadoop分布式集群的搭建的方法步驟

    這篇文章主要介紹了Hadoop分布式集群的搭建的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • OAuth從1.0到2.1的發(fā)展之路

    OAuth從1.0到2.1的發(fā)展之路

    OAUTH協(xié)議為用戶資源的授權(quán)提供了一個(gè)安全的、開放而又簡易的標(biāo)準(zhǔn)。簡單來說就是提供除了"賬戶密碼"驗(yàn)證方式以外的驗(yàn)證授權(quán)方式。這篇文章介紹了OAuth從1.0到2.1的發(fā)展之路,感興趣的同學(xué)可以收藏一下
    2021-11-11

最新評論