2

我正在嵌套聚合中执行热门聚合。我希望通过根文档中的时间戳字段来排序最高命中,以便获得嵌套文档的最新版本(可能被索引到多个根文档中)。虽然语法似乎让我这样做,但提取的排序键似乎是“垃圾”;每个文档的数量都相同。(以下只是一个更复杂的聚合的片段——否则,该方法可能没有意义——但它具有我的问题的本质。)

{
   "size": 0,
   "aggs": {
      "nested_doc": {
         "nested": {
            "path": "nested_doc"
         },
         "aggs": {
            "most_recent": {
               "top_hits": {
                  "sort": "_index_time"
               }
            }
         }
      }
   }
}

在我的结果中,排序键与任何这样的“_index_time”都不匹配,并且更改排序顺序没有效果。“_index_time”在根文档中被声明为整数。如果我将查询中的“_index_time”更改为一些无意义的字符串,查询会出错,所以我知道我的要求是有意义的,但它没有执行排序——或者,至少,它没有正确要排序的数据。

如何正确排序根属性上的嵌套聚合?

或者,我尝试将 copy_to: 'nested_doc._index_time' 添加到 '_index_time' 声明中,虽然这让我将 'nested_doc._index_time' 指定为排序键,但它仍然导致无意义的排序键。该字段是否未正确定义?

    _index_time: { type: 'integer'},
4

1 回答 1

1

我遇到了同样的问题,然后我在嵌套聚合中提供了一种解决方案。在这种情况下,我们可以添加一个并行聚合,其最大聚合为 on index_time。然后根据您添加的最大聚合对其进行排序。您只需要order根据您在第一级的聚合调整语句。

请查看以下查询:

{
   "size": 0,
   "aggs": {
      "nested_doc": {
         "nested": {
            "path": "nested_doc"
         },
         "order": {
            "max_date": "asc"
         }
         "aggs": {
            "most_recent": {
               "top_hits": {
                  "sort": "_index_time"
               }
            },
            "max_date": {
                 "max": {
                    "field": "_index_time"
                 }
             }

         }
      }
   }
}

希望这能解决您的问题。

于 2018-08-30T11:09:30.980 回答