Hoo*_*ini 1 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"
};
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)
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对象的外部对象.为了更容易编写查询,也有从隐式转换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);
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)
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |