2016-09-06 71 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之後,排序值變爲負數以確保正確的順序。