集聚分组弹性搜索中的需要分页 [英] Need pagination on Aggreration Groupping Elastic search

查看:16
本文介绍了集聚分组弹性搜索中的需要分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在应用聚合和分组,需要为此进行分页。

 let body = {
      size: item_per_page,
      "query": {
        "bool": {
          "must": [{
            "terms": {
              "log_action_master_id": action_type
            }
          }, {
            "match": {
              [search_by]: searchParams.user_id
            }
          }, {
            "match": {
              "unit_id": searchParams.unit_id
            }
          },
          {
            "range": {
              [search_date]: {
                gte: from,
                lte: to
              }
            }

          }
          ]
        }
      },
      "aggs": {
        "group": {
          "terms": {
            "field": "id",
            "size": item_per_page,
            "order": { "_key": sortdirction }

          },
        },
        "types_count": {
          "value_count": {
            "field": "id.keyword"
          }
        },
      },
    };

推荐答案

您可以使用以下选项:-

  1. Composite Aggregation:可以将多个数据源合并到一个存储桶中,并支持分页和排序。它只能使用AFTER_KEY进行线性分页,即不能从第1页跳到第3页。您可以获取"n"条记录,然后在KEY之后传递返回,并获取下一条"n"条记录。
GET index22/_search
{
 "size": 0,
 "aggs": {
   "ValueCount": {
     "value_count": {
       "field": "id.keyword"
     }
   },
   "pagination": {
     "composite": {
       "size": 2,
       "sources": [
         {
           "TradeRef": {
             "terms": {
               "field": "id.keyword"
             }
           }
         }
       ]
     }
   }
 }
}
  1. Include partition:在查询时将字段的值分组到多个分区中,并且在每个请求中只处理一个分区。术语字段均匀分布在不同的分区中。所以你必须事先知道词条的数量。您可以使用cardinality aggregation获取计数
GET index22/_search
{
  "size": 0,
  "aggs": {
    "TradeRef": {
      "terms": {
        "field": "id.keyword",
        "include": {
          "partition": 0,
          "num_partitions": 3
        }
      }
    }
  }
}
  1. Bucket Sort aggregation:对其父级多Bucket集合的Bucket进行排序。每个存储桶可以基于其_key、_count或其子聚集来排序。它仅适用于从父聚合返回的存储桶。您需要将术语大小设置为10,000(最大值),并截断Bucket_Sort中的存储桶。您可以使用From和Size进行分页,就像在查询中一样。如果您的术语超过10,000个,您将无法使用它,因为它只从按术语返回的存储桶中进行选择。
GET index22/_search
{
  "size": 0,
  "aggs": {
    "valueCount":{
      "value_count": {
        "field": "TradeRef.keyword"
      }
    },
    "TradeRef": {
      "terms": {
        "field": "TradeRef.keyword",
        "size": 10000
      },
      "aggs": {
        "my_bucket": {
          "bucket_sort": {
            "sort": [
              {
                "_key": {
                  "order": "asc"
                }
              }
            ],
            "from": 2, 
            "size": 1
          }
        }
      }
    }
  }
}

就性能而言,复合聚合是更好的选择

这篇关于集聚分组弹性搜索中的需要分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆