C# NEST 嵌套过滤器获取 dateRange 或 NULL 内的值

C# NEST nested filter to get values within the dateRange or NULL

我正在开发一些东西来显示用户年龄的饼图,并将它们切片为

这里我根据日期范围获取年龄;

var aggaResonse = client.Search<JSModel>(a => a
                  .Size(0)
                  .Query(q => q.Bool(b => b.Must(m => m
                                                            .DateRange(date => date
                                                            .Field(p => p.CreatedDate)
                                                            .GreaterThanOrEquals(start)
                                                            .LessThanOrEquals(end)),

                                                        m =>
                                                            m.Term(t => t.Field(f => f.StepType.Suffix("keyword")).Value("User"))

                                                      )
                  ))


                  .Aggregations(c => c.DateRange(nameof(AgeModel), x => x
                                                       .Field(f => f.BirthDate)
                                                       .Ranges(r => r.From(DateMath.Now.Subtract("17y")).To(DateMath.Now).Key(nameof(result.Years_0_17)),
                                                               r => r.From(DateMath.Now.Subtract("34y")).To(DateMath.Now.Subtract("18y")).Key(nameof(result.Years_18_34)),
                                                               r => r.From(DateMath.Now.Subtract("44y")).To(DateMath.Now.Subtract("35y")).Key(nameof(result.Years_35_44)),
                                                               r => r.From(DateMath.Now.Subtract("54y")).To(DateMath.Now.Subtract("45y")).Key(nameof(result.Years_45_54)),
                                                               r => r.From(DateMath.Now.Subtract("120y")).To(DateMath.Now.Subtract("55y")).Key(nameof(result.Years_55_Plus))

                                                               )


                                                 )
                        ));

            if (!aggaResonse.IsValid)
                return result;


            result.Years_0_17 = aggaResonse.Aggregations.Range(nameof(AgeModel)).Buckets.Single(c => c.Key == nameof(result.Years_0_17)).DocCount;
            result.Years_18_34 = aggaResonse.Aggregations.Range(nameof(AgeModel)).Buckets.Single(c => c.Key == nameof(result.Years_18_34)).DocCount;
            result.Years_35_44 = aggaResonse.Aggregations.Range(nameof(AgeModel)).Buckets.Single(c => c.Key == nameof(result.Years_35_44)).DocCount;
            result.Years_45_54 = aggaResonse.Aggregations.Range(nameof(AgeModel)).Buckets.Single(c => c.Key == nameof(result.Years_45_54)).DocCount;
            result.Years_55_Plus = aggaResonse.Aggregations.Range(nameof(AgeModel)).Buckets.Single(c => c.Key == nameof(result.Years_55_Plus)).DocCount;


            return result;

我需要为出生日期为 NULL 的用户提供一个“不可用”切片并将其映射为;

result.Not_Available = ....;

对遵循嵌套 NEST 聚合的最佳实践有什么建议吗?

我正在考虑 运行 另一次搜索,但我认为这不是最佳做法。

在挖掘文档太多之后,这是我写的解决方案;

我在当前聚合中添加了一个“缺失”属性;

&& c.Missing("DOBMissing", x => x.Field(f => f.BirthDate))

于是就变成了这样;

.Aggregations(c => c.DateRange(nameof(AgeModel), x => x
                                                       .Field(f => f.BirthDate)
                                                       .Ranges(r => r.From(DateMath.Now.Subtract("17y")).To(DateMath.Now).Key(nameof(result.Years_0_17)),
                                                               r => r.From(DateMath.Now.Subtract("34y")).To(DateMath.Now.Subtract("18y")).Key(nameof(result.Years_18_34)),
                                                               r => r.From(DateMath.Now.Subtract("44y")).To(DateMath.Now.Subtract("35y")).Key(nameof(result.Years_35_44)),
                                                               r => r.From(DateMath.Now.Subtract("54y")).To(DateMath.Now.Subtract("45y")).Key(nameof(result.Years_45_54)),
                                                               r => r.From(DateMath.Now.Subtract("120y")).To(DateMath.Now.Subtract("55y")).Key(nameof(result.Years_55_Plus))
                                                               )
                                                 ) &&
                                c.Missing("DOBMissing", x => x.Field(f => f.BirthDate))
            )

我访问了聚合的“缺失”部分,如下所示;

result.Not_Available = aggaResponse.Aggregations.Missing("DOBMissing").DocCount;