elasticsearch Elasticsearch嵌套:具有多个条件的排序术语聚合
使用NEST,我需要能够订购具有多个条件的术语聚合(需要ElasticSearch 1.5或更高版本)。例如:elasticsearch Elasticsearch嵌套:具有多个条件的排序术语聚合,elasticsearch,nest,elasticsearch,Nest,使用NEST,我需要能够订购具有多个条件的术语聚合(需要ElasticSearch 1.5或更高版本)。例如: “顺序”:[{“平均排名”:“描述”},{“平均得分”:“描述”}] 使用我创建的原始JSON来验证我是否获得了预期的行为,这非常有效。现在,在尝试使用NEST库将其转换为代码时,我不知道该如何实现 方法只有一个以字符串作为键的实现。我需要一个C#“params”类型的方法,该方法可以获取OrderDescending()和\或orderSuscending()元素的列表 有没有一种方
“顺序”:[{“平均排名”:“描述”},{“平均得分”:“描述”}]
使用我创建的原始JSON来验证我是否获得了预期的行为,这非常有效。现在,在尝试使用NEST库将其转换为代码时,我不知道该如何实现
方法只有一个以字符串作为键的实现。我需要一个C#“params”类型的方法,该方法可以获取OrderDescending()
和\或orderSuscending()
元素的列表
.OrderDescending(“平均排名”).OrderDescending(“平均分数”)
。这只不过是链条上的最后一个。通过查看代码,我可以了解原因。每次调用OrderDescending
都会盲目地更新字典,而不是检查字典是否已经更新,如果字典已经存在,则向字典添加一个新键
基于此,我相信这是一个bug,我在这里输入了一个报告:
编辑3:
我感谢所有的答案(其中一些被删除了),因为他们正在帮助推动这一进程,并负责这些编辑。我本来也应该提到,我发现:
“顺序”:{“平均排名”:“描述”,“平均得分”:“描述”}
不起作用。我不知道为什么,但ES在这种情况下只会使用最后一个。它是一个字典列表,如上面我的例子所示。我已经验证了在第二个元素上正确地对聚合进行子排序。因此,底层对象不能作为简单字典进行类型化。我还将此信息添加到我创建的bug报告中(如编辑2中所述)。如果使用流畅的语法,您可以将排序链接在一起 样本:
var esClient = ninjectKernel.Get<IElasticClient>();
var query = esClient.Search<RedemptionES>(s=> s
.SortAscending(a=>a.Date)
.SortDescending(d=>d.Input.User.Name)
);
NEST团队的Martijn Laarman反应非常迅速,非常友好,为我在上面描述的编辑2中报告的bug提供了解决方法。修复程序可以在同一错误报告的注释中找到:
请注意,他为对象初始值设定项和流畅语法(我需要的语法)提供了一种变通方法。我在对术语聚合排序,而不是对搜索结果排序。无论如何,请参见WRT链接上方的“编辑2”。
{
"sort": [
{
"@timestamp": {
"order": "asc"
}
},
{
"input.user.name": {
"order": "desc"
}
}
]
}