是否可以在 NEST 上查询多个术语字段(.NET)的聚合?
Is it possible to query aggregations on NEST for multiple term fields (.NET)?
下面是 NEST 查询和聚合:
Func<QueryContainerDescriptor<ConferenceWrapper>, QueryContainer> query =
q =>
q.Term(p => p.type, "conference")
// && q.Term(p => p.conference.isWaitingAreaCall, true)
&& q.Range(d => d.Field("conference.lengthSeconds").GreaterThanOrEquals(minSeconds))
&& q.DateRange(qd => qd.Field("conference.firstCallerStart").GreaterThanOrEquals(from.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")))
&& q.DateRange(qd => qd.Field("conference.firstCallerStart").LessThanOrEquals(to.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")));
Func<AggregationContainerDescriptor<ConferenceWrapper>, IAggregationContainer> waitingArea =
a => a
.Terms("both", t => t
.Field(p => p.conference.orgNetworkId) // seems ignore this field
.Field(p => p.conference.isWaitingAreaCall)
// .Field(new Field( p => p.conference.orgNetworkId + "-ggg-" + p.conference.networkId)
.Size(300)
.Aggregations(a2 => a2.Sum("sum-length", d2 => d2.Field("conference.lengthSeconds"))));
我调用了 .Field(p => p.conference.orgNetworkId)
,然后调用了 .Field(p => p.conference.isWaitingAreaCall)
,但 NEST 客户端似乎试图忽略第一个字段表达式。
是否可以将多个字段作为术语分组依据?
Elasticsearch 不支持直接对多个字段进行术语聚合;在 NEST 中对 .Field(...)
的调用是指定的而不是附加的,因此最后一次调用将覆盖任何先前设置的值。
为了聚合多个字段,您可以
在索引时创建一个复合字段,其中包含您希望聚合的值
或
通过组合两个字段值,使用 Script 生成在查询时聚合的术语。
第一个选项的性能会比第二个好。
下面是 NEST 查询和聚合:
Func<QueryContainerDescriptor<ConferenceWrapper>, QueryContainer> query =
q =>
q.Term(p => p.type, "conference")
// && q.Term(p => p.conference.isWaitingAreaCall, true)
&& q.Range(d => d.Field("conference.lengthSeconds").GreaterThanOrEquals(minSeconds))
&& q.DateRange(qd => qd.Field("conference.firstCallerStart").GreaterThanOrEquals(from.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")))
&& q.DateRange(qd => qd.Field("conference.firstCallerStart").LessThanOrEquals(to.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")));
Func<AggregationContainerDescriptor<ConferenceWrapper>, IAggregationContainer> waitingArea =
a => a
.Terms("both", t => t
.Field(p => p.conference.orgNetworkId) // seems ignore this field
.Field(p => p.conference.isWaitingAreaCall)
// .Field(new Field( p => p.conference.orgNetworkId + "-ggg-" + p.conference.networkId)
.Size(300)
.Aggregations(a2 => a2.Sum("sum-length", d2 => d2.Field("conference.lengthSeconds"))));
我调用了 .Field(p => p.conference.orgNetworkId)
,然后调用了 .Field(p => p.conference.isWaitingAreaCall)
,但 NEST 客户端似乎试图忽略第一个字段表达式。
是否可以将多个字段作为术语分组依据?
Elasticsearch 不支持直接对多个字段进行术语聚合;在 NEST 中对 .Field(...)
的调用是指定的而不是附加的,因此最后一次调用将覆盖任何先前设置的值。
为了聚合多个字段,您可以
在索引时创建一个复合字段,其中包含您希望聚合的值
或
通过组合两个字段值,使用 Script 生成在查询时聚合的术语。
第一个选项的性能会比第二个好。