Skip to content

Aggregation returns 0 items #986

@thomastvedt

Description

@thomastvedt

I'm trying to get aggregations to work with NEST, but result.Aggs.Terms("name").Items is empty.. The JSON beeing sent to ElasticSearch looks like this:

{
  "size": 0,
  "aggs": {
    "calls_per_customer": {
      "terms": {
        "field": "customer.id",
        "size": 10,
        "order": {
          "total_duration": "desc"
        }
      },
      "aggs": {
        "customer_name": {
          "terms": {
            "script": "_source.customer.name",
            "size": 1
          }
        },
        "total_duration": {
          "sum": {
            "field": "duration"
          }
        },
        "average_duration": {
          "avg": {
            "field": "duration"
          }
        }
      }
    }
  },
  "query": {
    "match_all": {}
  },
  "filter": {
    "and": {
      "filters": [
        {
          "term": {
            "answered": true
          }
        },
        {
          "exists": {
            "field": "customer.id"
          }
        }
      ]
    }
  }
}

and produces the following result when querying manually in head-plugin:

took: 211
timed_out: false
_shards: {
total: 5
successful: 5
failed: 0
}
hits: {
total: 6691
max_score: 0
hits: [ ]
}
aggregations: {
calls_per_customer: {
buckets: [
{
key: ecd15513-3020-44e8-a3bd-XXX
doc_count: 865
total_duration: {
value: 262867
}
customer_name: {
buckets: [
{
key: Customer name 1
doc_count: 865
}
]
}
average_duration: {
value: 303.89248554913297
}
}
{
key: b716031f-18ae-4843-a34d-XXX
doc_count: 675
total_duration: {
value: 171038
}
customer_name: {
buckets: [
{
key: Customer name 2
doc_count: 675
}
]
}
average_duration: {
value: 253.38962962962964

.......

Am I doing something wrong here?

var esResult = _esClient.Search<ElasticCall>(s =>
{
    var query = s.Query(qc => qc.MatchAll());

    var filters = new List<FilterContainer>();
    filters.Add(Filter<ElasticCall>.Term(call => call.Answered, true));
    filters.Add(Filter<ElasticCall>.Exists("customer.id"));

    query = query.Size(0);

    if (callDirection.HasValue)
    {
        filters.Add(Filter<ElasticCall>.Term(call => call.Direction, callDirection));
    }
    if (fromDate.HasValue)
    {
        filters.Add(Filter<ElasticCall>.Range(rs => rs.GreaterOrEquals(fromDate)));
    }
    if (toDate.HasValue)
    {
        filters.Add(Filter<ElasticCall>.Range(r => r.LowerOrEquals(toDate)));
    }

    query.Aggregations(agg => 
        agg.Terms("calls_per_customer", termsAggDescriptor => termsAggDescriptor.Field(call=>call.Customer.Id).Size(limitTop ?? 10).Aggregations(
            aggs2 => 
                aggs2.Terms("customer_name", s1 => s1.Script("_source.customer.name").Size(1))
                .Sum("total_duration", s2 => s2.Field("duration"))
                .Average("average_duration", s3 => s3.Field("duration")))));


    var filtersAsFunctionArray = filters.Select(f => (Func<FilterDescriptor<ElasticCall>, FilterContainer>)((z) => f)).ToArray();
    var outerAndFilter = Filter<ElasticCall>.And(filtersAsFunctionArray);
    query.Filter(outerAndFilter);

    //JSON is ok and returns expected result
    var json = Encoding.UTF8.GetString(_esClient.Serializer.Serialize(query));
    return query;
});

//NEST returns the first aggregation
var callsPerCust = esResult.Aggs.Terms("calls_per_customer");
//But nothing inside..
var callsCount = callsPerCust.Items.Count; //0!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions