【发布时间】:2020-08-25 12:14:09
【问题描述】:
好的,我有一个奇怪的问题,我不确定是否只是因为它们是 func 并且 func 对我来说很新(func 的整个想法让我有点恼火)。
我需要两次调用完全相同的查询,因为我需要 2 个图形/数据集。每个参数一个。因为我不想重复我的查询,所以我在我的类中添加了一个 func 参数,所以我可以在我的类中强类型选择正确的属性。
SearchDescriptor<Stats> Query(SearchDescriptor<Stats> qc, Func<Stats, double> field)
{
var query = qc
.Aggregations(aggs => aggs
.DateHistogram("histogram", d => d
.Field(f => f.Timestamp)
.FixedInterval("30m")
.MinimumDocumentCount(1)
.Aggregations(childAggs => childAggs
.Average("3", f => f
.Field(fi => field(fi))
)
)
)
)
.Query(q =>
q.Bool(b =>
b.Filter(
f => f.MatchPhrase(mp => mp
.Field(fi => fi.Name)
.Query(name)
),
f => f.DateRange(r => r
.Field(fi => fi.Timestamp)
.GreaterThanOrEquals(DateTime.UtcNow.AddDays(-1))
.LessThanOrEquals(DateTime.UtcNow)
)
)
)
);
return query;
}
var cpu = await GetByScrolling<Stats>(client, qc => Query(qc, fi => fi.CpuPercent));
var memory = await GetByScrolling<Stats>(client, qc => Query(qc, fi => fi.MemoryUsage));
这可以编译并且应该可以工作,但不幸的是生成的 JSON 是这样的:
"aggs": {
"3": {
"avg": {
"field": "field"
}
}
}
如您所见,值为field,这绝对是错误的。就像 NEST 的内部部分对存在的任何参数执行某种 .ToString(),这就是为什么它返回 field 而不是我在函数中输入的内容。
知道这是否应该是这样的吗?我的 JSON 中的 aggs 也对应于 .Aggregations(aggs => aggs lambda 命名。
【问题讨论】:
标签: c# elasticsearch nest