【问题标题】:ElasticSearch NEST - Sorting by list of dates in a specific rangeElasticSearch NEST - 按特定范围内的日期列表排序
【发布时间】:2014-11-06 17:28:33
【问题描述】:

我在弹性搜索中有一些文档具有以下映射(简化)

{
    "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。感谢您的任何想法 - 如果需要更多信息,请告诉我

【问题讨论】:

  • 您的源代码缺少查询声明,因此我无法复制。什么是查询?

标签: c# sorting elasticsearch nest


【解决方案1】:

这是一个棘手的要求,因为您要求的行为是模棱两可的,因为您试图对数组值进行排序。我认为你想要发生的是它对查询范围内的数组中的最小值进行排序。但是,这是假设升序排序;您希望对最大值进行降序排序吗?

考虑到所有因素,这是一个足够具体的要求,我认为没有简单的方法,但您可以通过script-based sort 实现这一点。该脚本必须复制查询范围并根据排序顺序将范围之外的任何值替换为非常低或非常高的值。 脚本非常强大,因为您可以使用 Groovy,而且 elasticsearch docs 非常好。

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

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

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

【讨论】:

  • 是的 - 我最终使用了一个包含更具体数据的子文档 - 尝试了一些脚本排序,但没有成功。感谢您的意见(很抱歉没有反馈,很忙)
【解决方案2】:

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

我认为,如果您使用的是 ES 1.x,您或许可以使用嵌套查询来做您想做的事,但 0.9 不支持这一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多