2016-09-06 72 views
0

比方说,我有2个文件: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被映射为{ “类型”: “日期”,“格式“:”date_time_no_millis“}。

我想基于最新things.datetime值,是不是在未来,这些文档进行排序。

I.e.通过简单地排序max.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

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

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

当没有更多的日期在nested_filter之后,排序值变为负数以确保正确的顺序。