#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. Это выглядит именно так, как я искал, завтра протестирую его и отчитаюсь. Спасибо!