2013-09-23 53 views
11

我有一些我想在日期字段上排序的文檔。對於日期等於指定日期的文檔,例如今天,以及之後的所有日期,我想按升序排序。對於指定日期之前的日期,我想按降序排列。ElasticSearch中的條件排序

這可能在ElasticSearch中嗎?如果這樣你能建議任何文學或方法。

日期的類型爲「日期」,格式爲「dateOptionalTime」。

感謝

回答

14

是的,這可以在ElasticSearch中使用腳本進行排序或打分。

我的偏好是一個評分腳本,因爲'基於腳本的分數'會更快(根據文檔)。

使用評分腳本,可以使用類型爲int/long的日期字段的Unix時間戳和custom_score查詢中的碎石排序腳本。您可能需要重新索引文件。您還需要能夠將搜索到的時間轉換爲Unix時間戳,以便在ElasticSearch中進行抽取。

然後,排序腳本會從每個文檔的時間戳中扣除所請求的時間戳並設置絕對值。然後結果按升序排序 - 最低的「距離」是最好的。

所以找日大約一年前文檔時,它看起來是這樣的:

"query": { 
    "custom_score" : { 
     "query" : { 
      .... 
     }, 
     "params" : { 
      "req_date_stamp" : 1348438345, 
     }, 
     "script" : "abs(doc['timestamp'].value - req_date_timestamp)" 
    } 
}, 
"sort": { 
    "_score": { 
     'order': 'asc' 
    } 
} 

(道歉在我的JSON任何錯誤 - 我測試了pyes這種想法)

你可能需要對此進行調整以獲得舍入權 - 例如,您的問題提及匹配日期,因此您可能需要將時間戳生成器舍入到最近的一天。

對於「完整」信息,您可以查看Custom Score Query docs並點擊鏈接到MVEL腳本。

+2

你搖滾人! – sunshinekitty

3

對於這種特定的使用情況,你應該使用一個排序腳本。

請參閱Sort documentation頁面中的「基於腳本的排序」部分。