QueryContainerDescriptor vs QueryContainer vs QueryBase - PullRequest
0 голосов
/ 02 июня 2018

Может кто-нибудь объяснить, в чем разница между QueryContainerDescriptor , QueryContainer & QueryBase ?

Как я могу назначить запрос (или QueryBase ) до QueryContainer ?

В приведенном ниже коде я могу назначить один и тот же TermQuery на QueryBase и QueryContainer объектам:

QueryBase bq = new TermQuery
{
    Field = Field<POCO>(p => p.Title),
    Value = "my_title"
};

QueryContainer tq = new TermQuery
{
    Field = Field<POCO>(p => p.Title),
    Value = "my_title"
};

Также я не уверен, есть ли какая-либо разница между созданием TermQuery с использованием QueryContainerDescriptor и вышеуказанным методом?

QueryContainer qcd = new QueryContainerDescriptor<POCO>().
    Term(r => r.Field(f => f.Title).Value("my_title"));

1 Ответ

0 голосов
/ 04 июня 2018
  • 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")
    )
);
...