假设我有两份文件:
{
"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
]
答案 0 :(得分:2)
实现这一目标的正确方法似乎是:
"sort": {
"things.datetime": {
"order": "desc",
"mode": "max",
"nested_path": "things",
"nested_filter": {
"range": {
"things.datetime": { "lte": "now" }
}
}
}
}
当nested_filter之后没有剩余日期时,排序值将变为负数,以确保正确的顺序。