我在弹性搜索中有一些文档,其中包含以下映射(简化)
{
"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 :(得分: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使用类似的脚本来实现排序要求。