Elasticsearch NEST:使用多个条件订购术语聚合

时间:2015-05-08 19:33:41

标签: elasticsearch nest

使用NEST,我需要能够订购具有多个条件的术语聚合(需要ElasticSearch 1.5或更高版本)。例如:

"order": [{"avg_rank": "desc"}, {"avg_score": "desc"}]

使用我创建的原始JSON来验证我是否获得了预期的行为。现在,在尝试使用NEST库将其转换为代码时,我还没有看到如何实现。

OrderDescending()方法只有一个实现,它接受键的字符串。我需要一个C#" params"类型方法,可以列出OrderDescending()和\或OrderAscending()元素。

  1. 有没有办法在NEST中做到这一点,我可以忽略?
  2. NEST是否有办法解决这个问题,我可以在需要的地方注入一些原始JSON?
  3. FWIW,我一直在使用"流利的"用于创建查询的样式。

    修改 我看到,使用"对象初始化程序"语法,我可以手动创建字典并添加我的标准元素。问题是,我有大量的代码写在"流利的"句法。所以,

    1. 有没有办法使用"对象初始化程序"对象并将其转换为"流利的"描述?在这种情况下,TermsAggregationDescriptor的一个TermsAggregator?
    2. 编辑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 中所述)。

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)

NEST团队的Martijn Laarman非常敏感,善于为我在上面描述的 EDIT 2 中报告的错误提供解决方案。该修复程序可以在同一个错误报告的评论中找到:Work around for NEST library multi-criteria aggregation ordering

请注意,他提供了对象初始值设定项和流畅语法(我需要的)的解决方法。