排序在elasticsearch聚集结果

问题描述 投票:0回答:1

我写了一个查询,以便从我的ES获得每个ID最近的记录。但这种查询的结果只做内部排序和选择最新的记录。现在我需要,我得按日期进行排序的结果。

这是我的查询:

{
   "size":0,
   "query":{
      "bool":{
         "must":[
            {
               "match":{
                  "base":"XYZ"
               }
            },
            {
               "match":{
                  "Type":"low"
               }
            }
         ]
      }
   },
   "aggs":{
      "sources":{
         "terms":{
            "field":"Id"
         },
         "aggs":{
            "latest":{
               "top_hits":{
                  "size":1,

                  "_source":{
                     "includes":[
                        "base",
                        "Type"
                     ]
                  },
                  "sort":{
                     "orderDate":"desc"
                  }
               }
            }
         }
      }
   }
}
elasticsearch
1个回答
0
投票

你所要做的是另一个另一桶排序桶。您可以通过两种方式实现:

(a)在聚合bucket_sort

(b)通过利用order PARAM条款聚合引用到另一桶。

(a) bucket_sort aggregation

这种聚合排序其父多斗聚集桶。您可以根据指定的字段(S)上的桶进行排序。用这种方法,你的情况下,查询将是:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "base": "XYZ"
          }
        },
        {
          "match": {
            "Type": "low"
          }
        }
      ]
    }
  },
  "aggs": {
    "source": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "latest": {
          "top_hits": {
            "size": 1,
            "_source": {
              "includes": [
                "base",
                "Type"
              ]
            },
            "sort": {
              "orderDate": "desc"
            }
          }
        },
        "latestOrder": {
          "max": {
            "field": "orderDate"
          }
        },
        "bucket_sort_order": {
          "bucket_sort": {
            "sort": {
              "latestOrder": {
                "order": "desc"
              }
            }
          }
        }
      }
    }
  },
  "post_filter": {
    "term": {
      "status": "yes"
    }
  }
}

在上面的查询我使用了命名为latestOrder一个最大的聚集。这种聚合为我们提供了最新的orderDate值。如果我们看一下作为最高命中聚合,它返回的文件将具有相同的orderDate由最大aggeration即latestOrder返回。其原因是,我们已经下令顶部由orderDate desc中命中和限制大小之一,这相当于最大orderDate

latestOrder可以作为我们的一个排序字段,然后在bucket_sort聚集用于这是由项聚集返回的桶父桶排序。

(b) order param in terms agg

我们使用类似的方法同上。我们用最大的聚集latestOrder和术语聚集order PARAM引用它。所以查询将是:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "base": "XYZ"
          }
        },
        {
          "match": {
            "Type": "low"
          }
        }
      ]
    }
  },
  "aggs": {
    "source": {
      "terms": {
        "field": "id",
        "order": {
          "latestOrder": "desc"
        }
      },
      "aggs": {
        "latest": {
          "top_hits": {
            "size": 1,
            "_source": {
              "includes": [
                "base",
                "Type",
                "orderDate"
              ]
            },
            "sort": {
              "orderDate": "desc"
            }
          }
        },
        "latestOrder": {
          "max": {
            "field":"orderDate"
          }
        }
      }
    }
  },
  "post_filter": {
    "term": {
      "status": "yes"
    }
  }
}

更新查询:基于对意见的讨论加入post_filter。

© www.soinside.com 2019 - 2024. All rights reserved.