Nest Elasticsearch C# 6.0.0.0桶聚合后多字段排序IPromise转换问题
嘿,我刚踩过Nest 6.x升级的这个排序坑!给你说说怎么改才能解决那个IPromise转换的问题。
首先得明白,Nest 6.x之后,很多API都换成了构建器模式+IPromise的方式,目的是保证配置的不可变性,原来直接实例化SortField的写法已经不适用了,尤其是在聚合排序的场景里。
具体修改步骤:
调整排序列表的类型:
把原来的List<SortField>换成List<Func<SortDescriptor<YourDocumentType>, IPromise<IList<SortField>>>>,这里的YourDocumentType是你搜索的文档实体类(比如Test字段所属的类)。重构循环里的排序项创建逻辑:
不再直接new SortField,而是用SortDescriptor的构建器方法生成排序规则,自动满足IPromise要求。比如你的代码可以改成这样:// 替换原来的List<SortField> var sortList = new List<Func<SortDescriptor<MyDocument>, IPromise<IList<SortField>>>>(); foreach (SortCriteria sc in sortCriterias) { var targetOrder = sc.SortMode == SortMode.Asc ? SortOrder.Ascending : SortOrder.Descending; // 用构建器创建排序项,自动适配IPromise sortList.Add(sortDesc => sortDesc .Field(sc.Field, fieldSort => fieldSort.Order(targetOrder))); }在聚合中使用排序列表:
配置桶聚合(比如Terms聚合)时,把这个sortList传给.Sort()方法即可,Nest会自动处理IPromise转换:var searchResult = await elasticClient.SearchAsync<MyDocument>(s => s .Aggregations(agg => agg .Terms("test_bucket", t => t .Field("Test") .Sort(sorts => sorts.AddRange(sortList)) // 传入排序列表 ) ) );
额外提醒:
如果你的排序是针对桶本身的属性(比如桶的文档数量、桶的key值),而非文档字段,要改用对应的排序方法:
- 按桶的文档数排序:
sortDesc => sortDesc.Count(targetOrder) - 按桶的key排序:
sortDesc => sortDesc.Key(targetOrder) - 按子聚合的指标排序:需要指定聚合路径,比如
sortDesc => sortDesc.Field("_bucket_sort", f => f.Path("your_sub_agg>your_metric").Order(targetOrder))
这样改完之后,那个IPromise转换的错误应该就消失了,这是Nest 6.x之后的标准写法,适配了新版本的不可变配置设计。
内容的提问来源于stack exchange,提问作者developer_ak
相关产品推荐
相关产品推荐

