2016-11-10 30 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