Вложить несколько терминов в синтаксис DSL

#elasticsearch #nest #dsl

#elasticsearch #вложить #dsl

Вопрос:

Я пытаюсь преобразовать следующий запрос в синтаксис NEST DSL:

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

Каждый из терминов поступает из списка, который содержит name и fieldId. До сих пор мне удавалось это делать:

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


  

Который работает, как и ожидалось, однако мне нужно иметь возможность указывать параметры Weight и Color динамически, поскольку метод может вызываться с другим набором параметров. Есть ли способ использовать что-то вроде:

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

  

Я думаю, это будет лучше работать с синтаксисом инициализатора объекта, однако я бы предпочел, чтобы это работало внутри dsl.

Ответ №1:

Будет работать что-то вроде следующего

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

который генерирует следующий запрос

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

Комментарии:

1. Это выглядит именно так, как я искал, завтра протестирую его и отчитаюсь. Спасибо!