QueryContainerDescriptor与QueryContainer vs QueryBase

时间:2018-06-02 03:14:22

标签: elasticsearch nest elasticsearch-net

任何人都可以解释 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"
};

此外,我不确定使用 QueryContainerDescriptor 和上述方法创建 TermQuery 之间是否存在任何差异?

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

1 个答案:

答案 0 :(得分:5)

  • 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实现并将其分配给类型为{{{ 1}}

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); ,您通常不需要在客户端调用之外实例化实例,因为实例将在调用中实例化。这是与Fluent API相同的请求

QueryContainerDescriptor<T>