任何人都可以解释 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"));
答案 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对象的外部。为了更容易组合查询,存在从QueryBase
到QueryContainer
的隐式转换,因此通常只需要实例化派生的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>