Search code examples
elasticsearchnestdsl

Nest multiple terms in DSL syntax


I'm trying to convert following query into NEST DSL syntax:

{
  "aggs": {
    "color": {
      "terms": {
        "field": "Color"
      }
    },
    "weight": {
      "terms": {
        "field": "Weight"
      }
    }
  }
}

Each of the terms is coming from the list which holds name and fieldId. So far I've managed to do this:

  var request2 = _client.Search<T>(s => s
               .Aggregations(aggs =>
                   aggs.Terms("Weight", x => x.Field("Weight")).Terms("Color", x => x.Field("Weight"))));


Which works as expected however I need to be able to supply parameters Weight and Color dynamically as the method can be called with different set of parameters. Is there a way how to use something like:

aggs.Terms(x => x.field( myList.foreach(y.value))));

I guess this would work better with the Object initializer syntax, however I would rather get this working inside dsl.


Solution

  • Something like the following would work

    var client = new ElasticClient();
    
    var fields = new List<string>
    {
        "color",
        "weight",
        "foo",
        "bar"
    };
    
    var response = client.Search<object>(s => s
        .Aggregations(aggs =>
        {
            foreach (var field in fields)
            {
                aggs.Terms(field, t => t.Field(field));
            }
    
            return aggs;
        })
    );
    

    which generates the following request

    {
      "aggs": {
        "color": {
          "terms": {
            "field": "color"
          }
        },
        "weight": {
          "terms": {
            "field": "weight"
          }
        },
        "foo": {
          "terms": {
            "field": "foo"
          }
        },
        "bar": {
          "terms": {
            "field": "bar"
          }
        }
      }
    }