2016-11-10 32 views
0

我有一个布尔查询,我想动态地添加到使用对象初始化语法,但我有麻烦这样做。基本上,我有5个检查参数的阶段,如果他们存在,他们会被添加到boolquery中。这里就是我想要做什么(显然不工作):elasticsearch巢2动态添加到bool查询

SomeBoolQuery.Must.ToList().Add(someQueryContainer); 

我怎样才能让上面的工作,这样我可以动态地添加查询到BoolQuery?不,我不能通过该做:

SomeBoolQuery.Must = new QueryContainer[] {query1, query2}; 

因为我不知道我有多少疑问将有,我不能一次添加它们。我需要一个动态解决方案。

我想也许这样的:

SomeBoolQueryContainer &= someQuery; 

,然后在最后:

SomeBoolQuery.Must = new QueryContainer[] {someBoolQueryContainer}; 

但是,这似乎有点多余,至少可以说。有任何想法吗?

编辑:上面尝试的最后一个选项似乎没有工作。没有返回任何结果。

回答

0

添加布尔查询动态使用流利API:

 ElasticQueryContainer elasticQueryContainer = GetSearchQuery(searchRequest); 
     var response = client.Search<IDocument>(s1 => s1 
       .Query(q => q 
        .Bool(bq => bq 
         .Should(elasticQueryContainer.orQuery.ToArray()) 
         .Must(elasticQueryContainer.andQuery.ToArray()) 
         .MustNot(elasticQueryContainer.notQuery.ToArray()) 

         ))); 


public class ElasticQueryContainer 
{ 
    public List<QueryContainer> orQuery { get; set; } 
    public List<QueryContainer> andQuery { get; set; } 
    public List<QueryContainer> notQuery { get; set; } 
    public ElasticQueryContainer() 
    { 
     orQuery = new List<QueryContainer>(); 
     andQuery = new List<QueryContainer>(); 
     notQuery = new List<QueryContainer>(); 
    } 
} 

public ElasticQueryContainer GetSearchQuery(SearchRequest searchRequest) 
{ 
//...Populate ElasticQueryContainer : orQuery, andQuery, notQuery dynamically 
var elasticQueryContainer = new ElasticQueryContainer(); 
if (!String.IsNullOrEmpty(searchRequest.FullTextSearch)) 
     { 
      elasticQueryContainer.andQuery.Add(new QueryStringQuery 
      { 
       Query = searchRequest.FullTextSearch.ToLower(), 
       DefaultOperator = searchRequest.FullTextOperator == SearchEnums.FullTextSearchOperator.AND ? Operator.And : Operator.Or 
      }); 
     } 
} 

的SearchRequest是具有要被搜索一个具有类属性。

public class SearchRequest 
{ 

    public String FullTextSearch { get; set; } 

    public SearchEnums.FullTextSearchOperator FullTextOperator { get; set; } 

} 

对于对象初始化器语法,就可以使用这种方式:

new BoolQuery() 
{ 
MustNot = elasticQueryContainer.notQuery.ToArray(), 
Should = elasticQueryContainer.orQuery.ToArray(), 
Must = elasticQueryContainer.andQuery.ToArray() 
}; 

您也可以参考:https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/bool-query-usage.html