谁能解释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对象的外部对象。为了使编写查询更容易,存在从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);
    

    使用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/

    10-12 21:35