Elasticsearch:按数组中的最大值排序

时间:2016-09-06 09:47:18

标签: arrays sorting datetime elasticsearch

假设我有两份文件:

{
  "id": "1234",
  "things": [
    {
      "datetime": "2016-01-01T12:00:00+03:00"
    },
    {
      "datetime": "2016-01-06T12:00:00+03:00"
    },
    {
      "datetime": "2100-01-01T12:00:00+03:00"
    }
  ]
}

{
  "id": "5678",
  "things": [
    {
      "datetime": "2016-01-03T12:00:00+03:00"
    },
    {
      "datetime": "2100-01-06T12:00:00+03:00"
    }
  ]
}

things.datetime被映射为{“type”:“date”,“format”:“date_time_no_millis”}。

我想根据最新的items.datetime值对这些文档进行排序。

即。只需最多的东西排序.datetime将使用日期2100-01-01T12:00:00 + 03:00和2100-01-06T12:00:00 + 03:00。我希望排序基于值2016-01-06T12:00:00 + 03:00和2016-01-03T12:00:00 + 03:00。

如何使用ElasticSearch 2.x实现此目的?

我试过了:

"sort": {
  "things.datetime": {
    "order": "desc", 
    "mode": "max"
  }
}

但即使在2100年的日期,这似乎也没有分类。

我也试过像这样使用nested_filter:

"sort": {
  "things.datetime": {
    "order": "desc", 
    "mode": "max",
    "nested_filter": {
      "range": {
        "things.datetime": { "lte": "now" }
      }
    }
  }
}

但它没有像我期望的那样起作用。

响应中的“排序”值也是负数。因此对于包含日期的文档:

"2015-10-24T05:50:00+03:00",
"2015-10-26T22:05:48+02:00",
"2015-10-24T08:05:43+03:00"

获得负排序值:

"sort": [
  -9223372036854775808
]

1 个答案:

答案 0 :(得分:2)

实现这一目标的正确方法似乎是:

"sort": {
  "things.datetime": {
    "order": "desc", 
    "mode": "max",
    "nested_path": "things",
    "nested_filter": {
      "range": {
        "things.datetime": { "lte": "now" }
      }
    }
  }
}

当nested_filter之后没有剩余日期时,排序值将变为负数,以确保正确的顺序。