ElasticSearch NEST - 按特定范围内的日期列表排序

时间:2014-09-12 13:50:26

标签: c# sorting 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。感谢您的任何想法 - 如果需要更多信息,请告诉我

2 个答案:

答案 0 :(得分:0)

在您的示例中,您有一个包含2个嵌套materialDates的orderTrades文档。 ES不会在单个orderTrades文档中对materialDates 进行排序。在ES中对结果进行排序时,它会对整个orderTrades文档的返回顺序进行排序。

我认为如果您使用ES 1.x,您可以使用嵌套查询来执行您想要的操作,但0.9不支持

答案 1 :(得分:0)

这是一个棘手的要求,因为您要求的行为是不明确的,因为您正在尝试对数组值进行排序。我认为你想要发生的是它对查询范围内的数组中的最小值进行排序。然而,这是假设升序;你想要一个降序排序来获得最大值吗?

考虑到所有事情,这是一个特定的要求,我不认为有一个简单的方法,但你可以通过script-based sort实现这一目标。该脚本必须复制查询范围,并将该范围之外的任何值替换为非常低或非常高的值,具体取决于排序顺序。 脚本非常强大,因为你可以使用Groovy,elasticsearch docs非常好。

话虽如此,脚本排序文档中的注释是一个有趣的注释:

  

注意,对于基于单个自定义脚本的排序,建议使用function_score查询,因​​为基于分数的排序更快。

您没有说明您是否在查询中使用评分,但如果没有,您可以使用function_score使用类似的脚本来实现排序要求。