2014-09-12 114 views
3

我有彈性的搜索與以下映射(簡體)ElasticSearch NEST - 在特定的範圍內

{ 
    "primaryRecord": { 
     "orderTrades": { 
       "type" : "nested", 
       "include_in_parent":true, 
       "properties" : { 
        "materialDates": {"type" : "date", "index" : "not_analyzed", "include_in_all" : "false"}, 
       } 
     } 
    } 
} 

一些文件排序按日期的名單現在 - 我查詢基於日期範圍內,得到的結果反對materialDates字段(實際上是索引中的日期列表) - 這一切都很好。我無法排序基於從列表日期匹配的結果的結果,例如:

範圍查詢:2014年7月7日 - 2014年7月14日

樣品文檔

{ 
    orderTrades: [ 
     { 
      materialDates: [3/13/2013, 7/10/2014, 8/10/2014] 
     }, 
     { 
      materialDates: [7/9/2014, 8/15/2014] 
     } 
    ] 
} 

兩個文檔與範圍過濾器相匹配,但按升序排序時,第二個對象應該排在第一位,但3/13/2013值被認爲是排序中的第一個。有沒有辦法只對匹配的數組值進行排序?我正在使用的當前NEST:

query.Sort(
    x => x.OnField(j => j.OrderTrades.Select(z => z.MaterialDates)) 
     .NestedPath(h => h.OrderTrades) 
     .NestedFilter(q => q.Range(
      v => v.OnField("orderTrades.materialDates").From(fromRange).To(toRange) 
     )) 
     .ToggleSort(true) 
); 

也限制爲彈性0.9。感謝您的任何想法 - 讓我知道是否需要更多信息

回答

0

支持它,因爲你問的行爲一個棘手的要求因爲你試圖對一個數組值進行排序是不明確的。我認爲你想要發生的是爲它排序在查詢範圍內的數組中的最小值。然而,這是假設升序;你想要一個降序排列最大的價值?

所有的事情都考慮到了,這是一個足夠具體的要求,我不認爲有一個簡單的方法,但你可以用script-based sort來實現這一點。腳本將不得不復制查詢範圍,並根據排序順序將範圍之外的值替換爲非常低或非常高的值。 腳本非常強大,因爲您可以使用Groovy,並且elasticsearch docs非常好。

話雖如此,在腳本分類文檔的說明是一個有趣的:

注意,建議,爲單一的基於基於自定義腳本排序,使用function_score查詢,而不是作爲排序依據評分是比較快的。

你不會說你是否在查詢中使用評分,但如果不是,你可以使用function_score來實現你的排序要求與類似的腳本。

+0

是的 - 我最終使用了一個具有更多特定數據的子文檔 - 嘗試了幾個腳本排序,但沒有實現。欣賞投入(對於缺乏反饋感到抱歉,很忙) – tymeJV 2014-09-22 13:41:43

0

在您的示例中,您有一個訂單貿易文檔與2個嵌套materialDates。 ES將不會在單一訂單交易文檔中對materialDates 進行排序。當您在ES中對結果進行排序時,它將整個orderTrades文檔的返回順序進行排序。

我認爲,如果你使用ES 1.x中,你可以使用或者使用嵌套查詢你想要做什麼,但沒有在0.9