C# ElasticSearch NEST-按特定范围内的日期列表排序
我在弹性搜索中有一些文档,映射如下(简化) 现在-我正在根据C# ElasticSearch NEST-按特定范围内的日期列表排序,c#,sorting,
elasticsearch,nest,C#,Sorting,
elasticsearch,Nest,我在弹性搜索中有一些文档,映射如下(简化) 现在-我正在根据materialDates字段(实际上是索引上的日期列表)的日期范围进行查询以获得结果-一切正常。我无法根据列表日期中的匹配结果对结果进行排序,例如: 范围查询:2014年7月7日-2014年7月14日 样本文档 { orderTrades: [ { materialDates: [3/13/2013, 7/10/2014, 8/10/2014] }, {
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
值,因此排在第一位。有没有办法只对匹配的数组值进行排序?我正在使用的当前嵌套:
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。谢谢您的建议-如果您的示例中需要更多信息,请告诉我您有一个orderTrades文档,其中包含两个嵌套的MaterialDate。ES不会对单个orderTrades文档中的物料日期进行排序。在ES中对结果进行排序时,它会对整个orderTrades文档的返回顺序进行排序
我认为,如果您使用的是ES 1.x,您可能可以使用嵌套查询来执行您想要的操作,但这在0.9中不受支持,这是一个棘手的要求,因为您要求的行为是不明确的,因为您试图对数组值进行排序。我认为您希望它按照查询范围内数组中的最小值进行排序。然而,这是假设一个升序排序;您希望对最大值进行降序排序吗 从各方面考虑,这是一个足够具体的要求,我认为没有一个简单的方法,但你可以用一个简单的方法来实现这一点。脚本必须复制查询范围,并根据排序顺序将范围之外的任何值替换为真正低或真正高的值。 脚本非常强大,因为您可以使用Groovy,而且脚本非常好 话虽如此,脚本排序文档中的注释是一个有趣的注释: 注意,对于基于单个自定义脚本的排序,建议使用函数_score query,因为基于分数的排序更快
您没有说明是否在查询中使用了评分,但如果没有,您可以使用类似的脚本来实现排序要求。是的-我使用了一个包含更具体数据的子文档-尝试了一些脚本排序,但没有成功。感谢您的输入(很抱歉没有反馈,很忙),您的源代码缺少查询声明,因此我无法复制。什么是查询?
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)
);