使用NEST,我需要能够订购具有多个条件的术语聚合(需要ElasticSearch 1.5或更高版本)。例如:
"order": [{"avg_rank": "desc"}, {"avg_score": "desc"}]
使用我创建的原始JSON来验证我是否获得了预期的行为。现在,在尝试使用NEST库将其转换为代码时,我还没有看到如何实现。
OrderDescending()
方法只有一个实现,它接受键的字符串。我需要一个C#" params"类型方法,可以列出OrderDescending()
和\或OrderAscending()
元素。
FWIW,我一直在使用"流利的"用于创建查询的样式。
修改 我看到,使用"对象初始化程序"语法,我可以手动创建字典并添加我的标准元素。问题是,我有大量的代码写在"流利的"句法。所以,
编辑2:
我本来应该提到我已经尝试了.OrderDescending("avg_rank").OrderDescending("avg_score")
。这只是在链中的最后一个。在查看代码时,我可以看到原因。每次调用OrderDescending
都会盲目地对字典进行新闻,而不是检查是否已经新增字典,并且如果字典已经存在,则将新密钥添加到字典中。
基于此,我相信这是我在此处输入报告的错误: OrderDescending and OrderAscending cannot be chained for multi-criteria ordering
编辑3: 我感谢所有的答案(其中一些被删除),因为他们正在帮助推动这一过程并负责这些编辑。我最初也应该提到我发现:
"order": { "avg_rank": "desc", "avg_score": "desc" }
不起作用。我不确定为什么肯定,但ES只会使用最后一个。它是一个字典列表,如上面的例子中所示。我已经验证了正确地对第二个元素上的聚合进行了子订单。因此,底层对象不能作为简单字典输入。我还将此信息添加到我创建的错误报告中(如 EDIT 2 中所述)。
答案 0 :(得分:0)
如果您正在使用流利的语法,您可以将这些排序链接在一起。
样品:
var esClient = ninjectKernel.Get<IElasticClient>();
var query = esClient.Search<RedemptionES>(s=> s
.SortAscending(a=>a.Date)
.SortDescending(d=>d.Input.User.Name)
);
响应:
{
"sort": [
{
"@timestamp": {
"order": "asc"
}
},
{
"input.user.name": {
"order": "desc"
}
}
]
}
答案 1 :(得分:0)
请注意,他提供了对象初始值设定项和流畅语法(我需要的)的解决方法。