【问题标题】:Elasticsearch: Get the ordering number of a specific itemElasticsearch:获取特定商品的订购号
【发布时间】:2020-12-10 08:08:58
【问题描述】:

在同行业的公司中,我需要选择收入最高的前 5 家公司,以及哪个公司在该行业中排名。 编写第一个查询很容易:

GET myIndex/_search
{
  "from": 0, 
  "size": 5, 
  "query": {
    "match": {
      "industryCode": "xxxx"
    }
  },
  "sort": [
    {
      "revenue": {
        "order": "desc"
      }
    }
  ]
}

但我不知道如何编写第二个查询。目前,我必须使用滚动功能来扫描同行业公司的所有记录,如下所示:

async Task<int> GetRank()
{
    int rank = 0;
    searchRequest.Size = 500;
    searchRequest.From = 0;
    searchRequest.Scroll = "1m";

    var rs = await _elasticClient.SearchAsync<Tmp>(searchRequest);

    while (rs.Documents.Count > 0)
    {
        foreach (var item in rs.Documents)
        {
            rank++;
            if (item.OrganCode == request.OrganCode) return rank;
        }
        rs = _elasticClient.Scroll<Tmp>("1m", rs.ScrollId);
    }

    return rank;
}

这种方法真的很慢,如果公司收入很低,可能需要几分钟才能产生结果。有没有办法解决这个问题?非常感谢!!!

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    如果我正确理解您的问题,您希望获得按行业代码分组的收入最高的前 5 家公司。这可以通过terms 聚合和top_hits 子聚合来完成

    {
      "aggs": {
        "industry_codes": {
          "aggs": {
            "top_companies": {
              "top_hits": {
                "size": 5,
                "sort": [
                  {
                    "revenue": {
                      "order": "desc"
                    }
                  }
                ]
              }
            }
          },
          "terms": {
            "field": "industryCode"
          }
        }
      },
      "size": 0
    }
    

    在 NEST 中,这看起来像

    var client = new ElasticClient(settings);
    
    var searchResponse = client.Search<Tmp>(s => s
        .Size(0)
        .Aggregations(a => a
            .Terms("industry_codes", t => t
                .Field(f => f.IndustryCode)
                .Aggregations(aa => aa
                    .TopHits("top_companies", th => th
                        .Sort(so => so
                            .Descending(f => f.Revenue)
                        )
                        .Size(5)
                    )   
                )
            )
        )
    );
    
    

    获取每个行业代码的热门搜索

    var termsAgg = searchResponse.Aggregations.Terms("industry_codes");
    
    foreach (var bucket in termsAgg.Buckets)
    {
        var topHits = bucket.TopHits("top_companies");
        
        foreach (var company in topHits.Documents<Tmp>())
        {
            // do something with company        
        }
    }
    

    【讨论】:

    • 不是,我想知道公司在行业中的收入排名。我找到了一个解决方案,只计算收入较高的公司数量,再加上 1
    • 对于“公司在行业中的收入排名”的实际含义,我可以看到两种可能的解释:1. 按行业对公司进行分组,并按收入降序对每个组进行排序,提供每个行业的排名。或 2. 将所有公司按收入降序排列,提供排名,然后按行业分组,找出每个行业前五名公司的全球排名。可能值得详细说明问题中的要求。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2019-05-29
    • 1970-01-01
    • 2019-01-26
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多