QueryBase
- это базовый тип для всех конкретных реализаций запроса
QueryContainer
- это контейнер для запроса.Он используется в местах, где ожидается запрос.
QueryContainerDescriptor<T>
- это тип для построения QueryContainer
с использованием шаблона интерфейса строитель / свободный.
NEST поддерживает как синтаксис Object Initializer, в котором запросы могут быть составлены посредством создания экземпляров типов, так и составление графа объектов путем назначения типов свойствам, а также синтаксис Fluent API, в котором можно создавать запросы.используя лямбда-выражения и беглый шаблон интерфейса.Все типы *Descriptor
в NEST являются компоновщиками синтаксиса Fluent API.Используйте тот синтаксис, который вы предпочитаете, или смешивайте и подбирайте по своему усмотрению:)
Вы можете подумать, зачем нам нужен QueryContainer
, почему бы просто не использовать QueryBase
?Итак, в представлении JSON объект JSON запроса сопоставляется с именем запроса как свойство внешнего , содержащего объект JSON, т.е.
{
"query": { // <-- start of outer containing JSON object
"term": { // <-- start of JSON query object
"field": {
"value": "value"
}
}
}
}
Относится к типам C #,QueryBase
будет сериализован в объект JSON запроса, а QueryContainer
будет внешним , содержащим объект JSON.Чтобы упростить составление запросов, существуют неявные преобразования из QueryBase
в QueryContainer
, поэтому часто вам просто нужно создать экземпляр производной реализации QueryBase
и присвоить ее свойству типа QueryContainer
var client = new ElasticClient();
var termQuery = new TermQuery
{
Field = "field",
Value = "value"
};
var searchRequest = new SearchRequest<MyDocument>
{
Query = termQuery // <-- Query property is of type QueryContainer
};
var searchResponse = client.Search<MyDocument>(searchRequest);
С QueryContainerDescriptor<T>
вам часто не нужно создавать экземпляр экземпляра вне клиентского вызова, так как экземпляр будет создан в вызове.Вот тот же запрос с Fluent API
client.Search<MyDocument>(s => s
.Query(q => q
.Term("field", "value")
)
);