谁能解释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"));
最佳答案
QueryBase
是所有具体查询实现的基本类型QueryContainer
是查询的容器。它用于需要查询的地方。 QueryContainerDescriptor<T>
是一种使用生成器/流利的界面模式构建QueryContainer
的类型。 NEST支持Object Initializer语法和Fluent API语法,在Object Initializer语法中,可以通过实例化类型并通过为属性分配类型来构成对象图,而Fluent API语法中,可以使用Lambda表达式和fluent接口(interface)模式来构成请求。 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
实现并将其分配给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")
)
);
关于elasticsearch - QueryContainerDescriptor与QueryContainer与QueryBase,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50653191/