最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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é)果中不會(huì)包含文檔,只會(huì)返回聚合的結(jié)果。
  • composite 聚合:這是我們實(shí)現(xiàn)分頁的關(guān)鍵。composite 聚合會(huì)根據(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 字段的值對(duì)文檔進(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 獲?。?code>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 可以避免偏移的性能開銷。
  • 基于字段的分組分頁:如果需要對(duì)某個(gè)字段進(jìn)行分組并進(jìn)行分頁,composite aggregation 是最合適的方式。
  • 避免數(shù)據(jù)丟失:使用傳統(tǒng)分頁方法時(shí),由于數(shù)據(jù)的變動(dòng)可能導(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ù)分布不均,可能會(huì)導(dǎo)致每頁的桶數(shù)不一致。
  • 限制聚合桶數(shù):雖然可以通過 size 參數(shù)控制每頁的結(jié)果數(shù),但需要注意的是,composite aggregation 每次最多只會(huì)返回 10,000 個(gè)桶。如果你的分頁范圍超過這個(gè)數(shù)量,可能需要對(duì)數(shù)據(jù)進(jìn)行分片或者其他優(yōu)化。

到此這篇關(guān)于ElasticSearch 使用 Composite Aggregation 實(shí)現(xiàn)桶的分頁查詢的文章就介紹到這了,更多相關(guān)ElasticSearch 使用 Composite Aggregation內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在CODEIGNITER中 在CI中引入外部的JS與CSS呢

    在CODEIGNITER中 在CI中引入外部的JS與CSS呢

    其實(shí)不管是在用CI還是ZF都有同樣一個(gè)問題,就是路徑的問題。前期,我在用ZF做CMS時(shí),我在.htaccess文件中設(shè)置了如遇到j(luò)s,css,img等資源文件都不重定向。
    2009-07-07
  • flask+layui+echarts實(shí)現(xiàn)前端動(dòng)態(tài)圖展示數(shù)據(jù)效果

    flask+layui+echarts實(shí)現(xiàn)前端動(dòng)態(tài)圖展示數(shù)據(jù)效果

    這篇文章主要介紹了flask+layui+echarts實(shí)現(xiàn)前端動(dòng)態(tài)圖展示數(shù)據(jù)效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • fastjson到底做錯(cuò)了什么?為什么會(huì)被頻繁爆出漏洞?(推薦)

    fastjson到底做錯(cuò)了什么?為什么會(huì)被頻繁爆出漏洞?(推薦)

    前段時(shí)間,fastjson被爆出過多次存在漏洞,很多文章報(bào)道了這件事兒,并且給出了升級(jí)建議。本文給大家分享fastjson的releaseNote以及部分源代碼。感興趣的朋友跟隨小編一起看看吧
    2020-07-07
  • C1任務(wù)01之修改游戲存檔的方法

    C1任務(wù)01之修改游戲存檔的方法

    這篇文章主要介紹了C1任務(wù)01之修改游戲存檔的相關(guān)知識(shí),前三個(gè)任務(wù)會(huì)用到十六進(jìn)制編輯器來實(shí)現(xiàn),在修改的的過程中涉及到的知識(shí)點(diǎn)為十進(jìn)制數(shù)據(jù)與十六進(jìn)制之間數(shù)據(jù)的相互轉(zhuǎn)換,需要的朋友可以參考下
    2021-10-10
  • IDEA開啟Run Dashboard的配置詳解

    IDEA開啟Run Dashboard的配置詳解

    這篇文章主要介紹了IDEA開啟Run Dashboard的配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 如何將服務(wù)器上的python代碼通過QQ發(fā)送回傳信息(附實(shí)現(xiàn)方法)

    如何將服務(wù)器上的python代碼通過QQ發(fā)送回傳信息(附實(shí)現(xiàn)方法)

    這篇文章主要介紹了我將服務(wù)器上的python代碼通過QQ發(fā)送回傳信息(附實(shí)現(xiàn)方法),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • pycharm、idea、golang等JetBrains其他IDE修改行分隔符的詳細(xì)步驟(換行符)

    pycharm、idea、golang等JetBrains其他IDE修改行分隔符的詳細(xì)步驟(換行符)

    這篇文章主要介紹了pycharm、idea、golang等JetBrains其他IDE修改行分隔符(換行符),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • chatgpt國內(nèi)鏡像?pycharm?idea插件使用詳解

    chatgpt國內(nèi)鏡像?pycharm?idea插件使用詳解

    這篇文章主要介紹了chatgpt國內(nèi)鏡像?pycharm?idea插件使用詳解,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • WebStorm 2019.2安裝配置方法圖文教程

    WebStorm 2019.2安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了WebStorm 2019.2安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • WebStorm打開多個(gè)項(xiàng)目的三種方法總結(jié)

    WebStorm打開多個(gè)項(xiàng)目的三種方法總結(jié)

    WebStorm支持多項(xiàng)目管理,本文介紹了三種方法:使用項(xiàng)目導(dǎo)航面板、窗口分割和多個(gè)WebStorm實(shí)例,項(xiàng)目導(dǎo)航面板可以在同一窗口內(nèi)管理多個(gè)項(xiàng)目,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09

最新評(píng)論

辉南县| 金阳县| 揭西县| 江川县| 合江县| 天等县| 石棉县| 吉首市| 涟水县| 时尚| 九台市| 迁安市| 甘孜| 大足县| 黄冈市| 武川县| 伊宁市| 江川县| 长汀县| 甘孜| 田阳县| 土默特左旗| 壤塘县| 杭州市| 兰州市| 安达市| 防城港市| 辉南县| 麻城市| 西乡县| 黎城县| 威远县| 新和县| 白山市| 垦利县| 紫阳县| 手机| 崇明县| 龙川县| 石阡县| 宿松县|