QueryContainerDescriptor与QueryContainer vs QueryBase

Hoo*_*ini 1 elasticsearch nest elasticsearch-net

任何人都可以解释QueryContainerDescriptor, QueryContainerQueryBase之间的区别是什么?

如何将查询(或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"
};
Run Code Online (Sandbox Code Playgroud)

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

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

Rus*_*Cam 5

  • QueryBase 是所有具体查询实现的基本类型

  • QueryContainer是查询的容器.它用于需要查询的位置.

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

NEST支持Object Initializer语法,其中可以通过实例化类型来组合请求,通过将类型分配给属性来组合对象图,还支持Fluent API语法,其中可以使用Lambda表达式和流畅的接口模式来组合请求.*DescriptorNEST中的所有类型都是Fluent API语法的构建器.使用您喜欢的任何语法,或根据您的需要混合搭配:)

您可能在想,为什么我们需要QueryContainer,为什么不使用QueryBase?好吧,在JSON表示中,查询JSON对象作为外部包含 JSON对象的属性键入查询名称,即

{
  "query": { // <-- start of outer containing JSON object
    "term": { // <-- start of JSON query object
      "field": {
        "value": "value"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

回溯到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);
Run Code Online (Sandbox Code Playgroud)

使用时QueryContainerDescriptor<T>,您通常不需要在客户端调用之外实例化实例,因为实例将在调用中实例化.这是与Fluent API相同的请求

client.Search<MyDocument>(s => s
    .Query(q => q
        .Term("field", "value")
    )
);
Run Code Online (Sandbox Code Playgroud)