gpt4 book ai didi

Elasticsearch 嵌套 : ordering terms aggregation with multiple criteria

转载 作者:行者123 更新时间:2023-12-04 06:35:20 28 4
gpt4 key购买 nike

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

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

使用我创建的原始 JSON 来验证我是否获得了预期的行为,效果很好。现在,在尝试使用 NEST 库将其转换为代码时,我不知道如何实现。

OrderDescending() 方法只有一个采用字符串作为键的实现。我需要一个 C#“params”类型的方法,它可以获取 OrderDescending() 和\或 OrderAscending() 元素的列表。

  1. 有没有办法在我忽略的 NEST 中执行此操作?
  2. 在 NEST 中有没有办法解决这个问题,我可以在需要的地方注入(inject)一点原始 JSON?

FWIW,我一直在使用“流畅”的风格来创建我的查询。

编辑:我看到,使用“对象初始值设定项”语法,我可以手动创建字典并添加我的条件元素。问题是,我有大量代码是用“流畅”的语法编写的。所以,

  1. 有没有办法使用“对象初始化器”对象并将其转换为“流畅”的描述符?在这种情况下,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 中所述)。

最佳答案

如果您使用的是流畅的语法,则可以将这些排序链接在一起。

示例:

    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"
}
}
]
}

关于 Elasticsearch 嵌套 : ordering terms aggregation with multiple criteria,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30131551/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com