我使用复合和术语聚合来获得基于给定字段的分组结果。我还使用基数聚合来获取聚合桶的总计数。
下面是我发送的请求查询,以获得相应的响应:
请求:
"aggs": {
"myfield_comp_agg": {
"aggs": {
"myfield": {
"aggs": {
"myfield_tophits": {
"top_hits": {
"size": 1
}
}
},
"terms": {
"field": "myfield",
"size": 10
}
}
},
"composite": {
"after": {
"myfield_comp_terms_agg": ""
},
"sources": [
{
"myfield_comp_terms_agg": {
"terms": {
"field": "myfield"
}
}
}
]
}
},
"Count_agg": {
"cardinality": {
"field": "myfield"
}
}
}
答复:
{
...,
"aggregations" : {
"Count_agg" : {
"value" : 33
},
"myfield_comp_agg" : {
"after_key" : {
"myfield_comp_terms_agg" : "value10"
},
"buckets" : [
{
"key" : {
"DocId_comp_terms_agg" : "value1"
},
"doc_count" : 1,
"DocId" : {...}
},
{...},
{...},
{...}
]
}
}
}
我使用Kibana检查查询,它对我来说很好。
但是,我不确定如何在我的NEST对象语法中使用这个基数聚合器。
这是我的代码:
var termsAggregation = new TermsAggregation(GetTermsAggregationName(aggregationField)) {
Field = aggregationField,
Size = takeCount
};
var topHitsAggregation = new TopHitsAggregation(GetTopHitsAggregationName(aggregationField)) {
Size = aggregationFieldCount
};
var termsAggregationContainer = new AggregationContainer {
Terms = termsAggregation,
Aggregations = topHitsAggregation
};
var subAggregations = new Dictionary<string, IAggregationContainer>() {
{ aggregationField, termsAggregationContainer}
};
var compositeKey = new Dictionary<string, object>() {
{ GetCompositeTermsAggregationName(aggregationField), aggregationSkipValue }
};
var termsSource = new TermsCompositeAggregationSource(GetCompositeTermsAggregationName(aggregationField)) {
Field = aggregationField
};
var compositeAggregation = new CompositeAggregation(GetCompositeAggregationName(aggregationField)) {
After = new CompositeKey(compositeKey),
Sources = new List<TermsCompositeAggregationSource> { termsSource },
Aggregations = subAggregations
};
var searchRequest = new SearchRequest(request.IndexName)
{
From = request.SkipCount,
Size = request.TakeCount
};
searchRequest.Aggregations = compositeAggregation;
ElasticSearchClient.Search<T>(searchRequest);
我将非常感谢任何帮助。
回答由Russ在评论中发布。
看看为客户编写聚合文档;对于更简洁的对象初始值设定项语法,如使用AggregationDictionary和
这是一个匹配请求查询的示例
var client = new ElasticClient();
AggregationDictionary aggs = new CompositeAggregation("myfield_comp_agg")
{
After = new CompositeKey(new Dictionary<string, object>
{
{ "myfield_comp_terms_agg", string.Empty }
}),
Sources = new ICompositeAggregationSource[]
{
new TermsCompositeAggregationSource("myfield_comp_terms_agg")
{
Field = "myfield"
}
},
Aggregations = new TermsAggregation("myfield")
{
Field = "myfield",
Size = 10,
Aggregations = new TopHitsAggregation("myfield_tophits")
{
Size = 1
}
}
} && new CardinalityAggregation("Count_agg", "myfield");
var searchRequest = new SearchRequest("my_index")
{
Aggregations = aggs
};
var searchResponse = client.Search<object>(searchRequest);
谢谢你的帮助。它工作得很好。
我在使用聚合框架从MongoDB读取文档时遇到了问题:我的结果中总是得到空ID。这只发生在具有复合ID的文档中。我尝试了各种版本的spring-data-mongob(1.10.12, 2.0.7),结果相同。 实体定义类 测试代码 输出 调试到以下方法MappingMongoConverter。read(final mongopersistenentity entity、final Docume
我试图在Hibernate中执行命名查询。查询在此映射文件中定义: MxePosition类如下: 我试图做的是让命名查询返回由另一列分组的一列的总和。然而,Hibernate抛出了一个错误,我怀疑这是因为查询结果不包含ID列。 有办法吗?必须能够在Hibernate中执行包含GROUP BY子句的查询,而不在结果中包含ID。 如果有更好的方法,我愿意接受其他不使用命名查询的建议。
对于Cassandra中的用户定义聚合函数,什么可以作为INITCOND?我只见过具有简单类型(例如元组)的示例。 我为聚合函数中的状态对象提供了以下类型: 当我省略INITCOND时,我得到一个JavaNullPointerException。
我一直在尝试在聚集中添加超时,以避免等待每个流都完成。但是当我添加超时时,它不起作用,因为聚合器等待每个流完成。 E、 在我的流中,其中一个有2秒的延迟,另一个有4秒的延迟 我使用遗嘱执行人。newCachedThreadPool()以并行运行。我想释放包含的每条消息,直到超时完成 我一直在测试的另一种方法是使用默认的gatherer,并在scatterGather中设置GathereTimeou
我收集了用户在商店购买的物品,以及他从朋友那里得到的喜欢和不喜欢的东西。集合字段如下所示: 现在,我想得到以下总结: 获取用户X的(喜欢-不喜欢)差异 获取用户X的差异(喜欢-不喜欢)到存储Y 获取用户X的(喜欢-不喜欢)差异到商店Y和产品Z 对于#1,我做了: 我得到了正确的结果: [{"_id":"542ea90fbb1e37b09f660980","rankDiff": 2}] 但当我试图通
我正在尝试设置一个搜索查询,该查询应通过多级嵌套字段复合聚合集合,并从该集合中提供一些子聚合指标。我能够按预期使用其存储桶获取复合聚合,但所有存储桶的子聚合指标都带有。我不确定我是否未能正确指出子聚合应考虑哪些字段,或者它是否应放置在查询的不同部分中。 我的收藏看起来类似于以下内容: 贝娄,你可以找到我已经尝试了。尽管所有文档都有一个设置的点击值,但所有存储桶都带有点击总数。 到目前为止,我的回应