弹性搜索中聚集的排序结果

时间:2019-02-01 16:08:55

标签: elasticsearch

我编写了一个查询,以从我的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"
                  }
               }
            }
         }
      }
   }
}

1 个答案:

答案 0 :(得分:0)

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

(a)通过bucket_sort聚合

(b)通过将order参数用于术语聚合来引用另一个存储桶。

(a)bucket_sort聚合

此聚合对其父级多存储桶聚合的存储桶进行排序。您可以指定将对存储桶进行排序的字段。使用此查询,您的案例查询将为:

{
  "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)所返回的latestOrder相同的orderDate。原因是我们已将orderDate的命中顺序排序为最高,并将大小限制为一个,这等于最大值latestOrder

bucket_sort对我们来说是一个排序字段,然后在order聚合中用于对父存储桶(由术语聚合返回的存储桶)进行排序。

(b)latestOrder参数agg

我们使用与上述类似的方法。我们使用最大聚合order,并在术语聚合的{ "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" } } } 参数中引用它。因此查询将是:

{{1}}

查询中的更新:基于在post_filter中添加的注释中的讨论。