请求将多聚合Elasticsearch查询转换为NEST/C#并实现动态构建
基于NEST/C#实现动态地区房源价格中位数聚合查询
核心思路
遍历传入的地区href列表,为每个href生成独立的Filter聚合:
- 每个聚合包含统一过滤条件:价格>1、
searchType为Buy、排除isExclusiveList为true的房源 - 针对当前地区href添加专属过滤规则
- 每个Filter聚合嵌套Percentiles聚合,计算50分位数(即中位数)
完整代码实现
1. 初始化Elasticsearch客户端
先通过NuGet安装NEST包,再初始化客户端:
var settings = new ConnectionSettings(new Uri("http://你的ES地址:9200")) .DefaultIndex("listings"); // 默认指定索引为listings var client = new ElasticClient(settings);
2. 动态构建查询的方法
public async Task<ISearchResponse<dynamic>> GetSuburbPriceMedians(List<string> suburbHrefs) { var searchRequest = new SearchRequest { Size = 0, // 无需返回文档,仅获取聚合结果 Aggregations = new AggregationDictionary() }; foreach (var href in suburbHrefs) { // 从href提取地区ID,用于生成聚合名称(如从"/locations/5715329"得到"5715329") var suburbId = href.Split('/').Last(); var aggregationName = $"suburb_{suburbId}"; // 构建当前地区的过滤组合条件 var filter = new BoolQuery { Must = new List<QueryContainer> { new RangeQuery { Field = "price", GreaterThan = 1 }, new TermsQuery { Field = "location.hrefs", Terms = new[] { href } }, new TermQuery { Field = "searchType", Value = "Buy" } }, MustNot = new List<QueryContainer> { new TermQuery { Field = "isExclusiveList", Value = true } } }; // 为当前地区添加Filter聚合,嵌套中位数计算子聚合 searchRequest.Aggregations.Add(aggregationName, new FilterAggregation { Filter = filter, Aggregations = new AggregationDictionary { { "median", new PercentilesAggregation("median", "price") { Percents = new[] { 50.0 } } } } }); } // 执行异步查询 return await client.SearchAsync<dynamic>(searchRequest); }
3. 调用示例与结果解析
// 传入需要查询的地区href列表 var targetSuburbs = new List<string> { "/locations/5715329", "/locations/5716208" }; var response = await GetSuburbPriceMedians(targetSuburbs); // 遍历解析每个地区的中位数结果 foreach (var href in targetSuburbs) { var suburbId = href.Split('/').Last(); var aggregationName = $"suburb_{suburbId}"; if (response.Aggregations.TryGet<AggregateDictionary>(aggregationName, out var suburbAgg)) { if (suburbAgg.TryGet<PercentilesAggregate>("median", out var medianAgg)) { var medianPrice = medianAgg.Values.FirstOrDefault(v => v.Key == 50)?.Value; Console.WriteLine($"地区{suburbId}的房价中位数:{medianPrice:C}"); } } }
代码说明
- 动态聚合生成:通过遍历href列表自动创建聚合项,彻底替代硬编码方式
- 条件复用:统一过滤规则在所有地区聚合中复用,仅地区href为动态参数
- 结果匹配:通过聚合名称与地区ID的对应关系,精准提取每个地区的中位数数据
内容的提问来源于stack exchange,提问作者RPM1984
相关产品推荐
相关产品推荐

