2016-01-21 32 views
1

我在Elasticsearch映射(我正在使用ES 2.1)中有一個類型爲date(輸入格式爲epoch_second)的字段。我知道我可以在如何在Elasticsearch中對日期字段進行排序時指定「精度」?

之間排序
{ 
    "sort": [ 
    { 
     "myDateField" : { 
     "order": "desc" 
     } 
    } 
    ] 
} 

但是這種以秒爲單位的精確度。我想用「周間隔」,並在同一個星期內的得分(第7天,從現在落後間隔)再次,像這樣(pseduocode)排序:

{ 
    "sort": [ 
    { 
     "myDateField" : { 
     "order"  : "desc", 
     "precision" : "week" 
     } 
    }, 
    "_score" 
    ] 
} 

因此,所有被擊中在過去的7天應該排在同一位置,在接下來的「排序組」中排在7天以上且小於14天,等等。並且每個「星期組」應該再次按分數排序。

換句話說:「最近7天最相關的(對當前查詢)文檔有什麼意義(但是不要完全過濾掉更老的文檔)?」

背景:事件搜索,顯然更近期的事件應該最重要。

我該如何做到這一點?

+0

它看起來很喜歡你試圖在sql中做類似GROUP BY的事情,它在彈性搜索中同樣聚集在一起如何檢查https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations -bucket-datehistogram-aggregation.html這一個? – FZE

+0

但由於性能原因聚合不支持分頁(https://github.com/elastic/elasticsearch/issues/4915)。 –

+0

這是一個真正的解決方法,可能有更好的解決方案,通過排序,但如果它吸引了你,無論如何只是檢查它的評論看起來不錯https://github.com/elastic/elasticsearch/issues/4915#issuecomment-69942916 – FZE

回答

0

我讀到劇本的排序,這是我的解決方案,它爲我的作品:

{ 
    "sort": [ 
    "_script": { 
     "lang": "expression", 
     "type": "number", 
     "script": "doc['myDateField'].value - doc['myDateField'].value % 604800000" 
     "order": "desc" 
    }, 
    "_score" 
    ] 
} 

什麼我在這裏做的是將我的日期字段由以毫秒錶示的期望跨度(Elasticsearch在內部存儲日期字段long,映射到毫秒)並取餘數。然後減去實際日期的餘數。通過這種方式,所有日期都被截斷爲「0(0至6)天之前」。這樣,同一個7天間隔內的所有文檔將具有相同的時間戳,並根據它進行平均排序。最後我追加了常規分數排序作爲二階條件。

我不確定性能如何在這個解決方案上擴展,但對於我需要這種排序的幾千個文檔,我無法注意到任何延遲都會導致非排序。

2

您可能會發現在您的情況有用decay function on a function score query。它專門設計用於調整文檔的分數,其中某個字段的「距離」來自某個確定的起點。

這適用於日期以及數字和地理點字段。它接受origin選項,該選項設置將比較其他文檔的參考日期。方便的是,如果您不提供日期字段的來源,則默認爲當前日期(這應該適用於您的方案)。

您可能想將您的offset設置爲7天。這樣,過去7天的所有文件將被平等地評分。在該範圍之外,分數開始下降,取決於您使用的衰減函數。

嘗試是這樣的:

{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match": { 
      "field1": "search goes here" 
     } 
     }, 
     "functions": [ 
     { 
      "exp": { 
      "myDateField": { 
       "offset": "7d", 
       "scale": "14d", 
       "decay": 0.5 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
相關問題