QueryContainerDescriptor 与 QueryContainer 与 QueryBase

QueryContainerDescriptor vs QueryContainer vs QueryBase

谁能解释一下 QueryContainerDescriptorQueryContainerQueryBase 之间的区别?

如何将查询(或 QueryBase)分配给 QueryContainer

在下面的代码中,我可以将相同的 TermQuery 分配给 QueryBaseQueryContainer对象:

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

另外,我不确定使用 QueryContainerDescriptor 创建 TermQuery 和上述方法之间是否有任何区别?

QueryContainer qcd = new QueryContainerDescriptor<POCO>().
    Term(r => r.Field(f => f.Title).Value("my_title"));
  • QueryBase 是所有具体查询实现的基类型

  • QueryContainer 是查询的容器。它用于需要查询的地方。

  • QueryContainerDescriptor<T> 是一种使用构建器/流畅界面模式构建 QueryContainer 的类型。

NEST 既支持 Object Initializer 语法,其中可以通过实例化类型和通过将类型分配给属性来组合对象图来组合请求,也支持 Fluent API 语法,其中可以使用 Lambda 表达式组合请求和流畅的界面模式。 NEST 中的所有 *Descriptor 类型都是 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对象。为了更容易编写查询,存在从 QueryBaseQueryContainer 的隐式转换,因此通常您只需要实例化派生的 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")
    )
);