【发布时间】:2015-05-08 19:33:41
【问题描述】:
使用 NEST,我需要能够订购具有多个条件的术语聚合(需要 ElasticSearch 1.5 或更高版本)。例如:
"order": [{"avg_rank": "desc"}, {"avg_score": "desc"}]
使用我创建的原始 JSON 来验证我是否获得了预期的行为,这非常有效。现在,在尝试使用 NEST 库将其转换为代码时,我不知道如何实现。
OrderDescending() 方法只有一个实现,它接受一个字符串作为键。我需要一个可以获取OrderDescending() 和\或OrderAscending() 元素列表的C#“params”类型方法。
- 有没有办法在我忽略的 NEST 中执行此操作?
- NEST 中有没有办法解决这个问题,我可以在需要的地方注入一点原始 JSON?
FWIW,我一直在使用“流利”样式来创建查询。
编辑: 我看到,使用“对象初始化器”语法,我可以手动创建字典并添加我的条件元素。问题是,我有大量用“流利”语法编写的代码。所以,
- 有没有办法使用“对象初始化器”对象并将其转换为“流畅”描述符?在这种情况下,一个 TermsAggregator 到一个 TermsAggregationDescriptor?
编辑 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 中所述)。
【问题讨论】:
标签: elasticsearch nest