如何在NEST中实现嵌套Terms聚合?Elasticsearch 5.4相关
用NEST 5.3.0实现嵌套Terms聚合的解决方案
我明白你在实现嵌套聚合时遇到的困扰了,刚好我对NEST 5.x的聚合写法很熟悉,这就帮你把给定的DSL转换成对应的NEST代码。
先把你提供的DSL整理得更清晰些,方便对照:
{ "size": 0, "aggs": { "FILTER": { "filter": { "term": { "field": "INPUT_VARIABLE_OF_THE_METHOD" } }, "aggs": { "TERMS_ROWS": { "terms": { "field": "row" }, "aggs": { "TERMS_COLUMNS": { "terms": { "field": "column" } } } } } } } }
对应的NEST实现代码
下面是完全匹配上述DSL的C#代码,每个部分都对应DSL的层级结构:
// 假设你已经初始化好ElasticClient实例(配置好节点等信息) var client = new ElasticClient(settings); var searchResponse = client.Search<Response>(s => s .Index("my_index") .Type("responses") .Size(0) // 对应DSL里的"size":0,仅返回聚合结果,不返回文档 .Aggregations(a => a // 第一层:Filter聚合,命名为"FILTER" .Filter("FILTER", f => f .Filter(fd => fd .Term("field", "INPUT_VARIABLE_OF_THE_METHOD") // 过滤指定字段值 ) // 嵌套第一层Terms聚合:按row字段分组 .Aggregations(aa => aa .Terms("TERMS_ROWS", t => t .Field("row") // 嵌套第二层Terms聚合:在每个row分组下按column字段再分组 .Aggregations(aaa => aaa .Terms("TERMS_COLUMNS", tc => tc .Field("column") ) ) ) ) ) ) );
代码补充说明
- 如果你的
Response实体类里有row和column对应的强类型属性,也可以用.Field(p => p.Row)这种写法,能避免字段名拼写错误,更安全。 - 执行查询后,你可以这样解析聚合结果:
var filterAgg = searchResponse.Aggregations.Filter("FILTER"); var rowsAgg = filterAgg.Terms("TERMS_ROWS"); foreach (var rowBucket in rowsAgg.Buckets) { var columnsAgg = rowBucket.Terms("TERMS_COLUMNS"); // 在这里处理每个row分组下的column分组数据 }
这个写法完全适配Elasticsearch 5.4和NEST 5.3.0的版本,你可以直接拿去测试~
内容的提问来源于stack exchange,提问作者Nili
相关产品推荐
相关产品推荐

