如何通过根文档中的字段对嵌套聚合中的最高匹配进行排序?

时间:2016-10-17 18:53:27

标签: elasticsearch aggregation elasticsearch-aggregation

我在嵌套聚合中执行热门命中聚合。我希望通过根文档中的时间戳字段来命令顶部命中,以便获得嵌套文档的最新版本(可以将其索引到多个根文档中)。虽然语法似乎让我这样做,但提取的排序键似乎是' junk&#39 ;;每个文件的数字都相同。 (以下只是更复杂聚合的片段 - 否则,这种方法可能毫无意义 - 但它具有我问题的本质。)

{
   "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'},

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,然后在嵌套聚合中提出了一种解决方案。在此,我们可以在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"
                 }
             }

         }
      }
   }
}

希望这可以解决您的问题。