You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将多聚合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:32:11