elasticsearch - Elasticsearch:NEST中具有基数的复合聚合

标签 elasticsearch nest elasticsearch-aggregation elasticsearch-query

我正在使用复合词和术语聚合来基于给定字段获得分组结果。我还使用基数聚合来获取聚合存储桶的总数。

以下是我发送的请求查询,以获取相应的响应:

请求:

"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和&& ing聚合来组合它们。

这是一个与请求查询匹配的示例

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);

谢谢您的帮助。效果很好。

关于elasticsearch - Elasticsearch:NEST中具有基数的复合聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61156016/

相关文章:

elasticsearch - 在 Multi-Tenancy 索引中区分_delete_by_query任务

python - Elasticsearch:时间范围聚合未按预期工作

elasticsearch - Elasticwhere NEST条件为

elasticsearch - Elastic Search中相同类型的多个字段上的平均值或任何其他聚合

elasticsearch - 使用Elasticsearch获取文档中特定字段的数量

linux - Logstash 打开了太多文件?

elasticsearch - Elasticsearch 平均时差聚合查询

elasticsearch - 删除后搜索返回文档

c# - 非泛型类型字段不能与类型参数一起使用

elasticsearch - 在Elasticsearch中获取第N页数据进行复合聚合的正确方法是什么?