2014-09-12 102 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