2016-11-10 5 views
0

Ich habe eine boolesche Abfrage, die ich dynamisch zur Syntax des Objekts intializer hinzufügen möchte, aber ich habe Probleme damit. Grundsätzlich habe ich 5 Stufen, um Parameter zu überprüfen, und wenn sie existieren, werden sie zur Boolquery hinzugefügt. Hier ist, was ich versuche zu tun (natürlich nicht funktioniert):elasticsearch nest 2 dynamisch zur bool-Abfrage hinzufügen

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

Wie kann ich die oben Arbeit machen, so dass ich dynamisch Anfragen an den BoolQuery hinzufügen kann? Nein, ich kann es über das nicht tun:

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

Weil ich weiß nicht, wie viele Anfragen ich haben werde, und ich kann sie alle auf einmal hinzufügen. Ich brauche eine dynamische Lösung.

Ich dachte, vielleicht dies:

SomeBoolQueryContainer &= someQuery; 

und dann am Ende:

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

Aber das scheint ein wenig überflüssig, gelinde gesagt. Irgendwelche Ideen?

EDIT: Die letzte oben versuchte Option scheint nicht zu funktionieren. Keine Ergebnisse zurückgegeben.

Antwort

0

Hinzufügen von Bool Abfrage dynamisch Fluent 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 
      }); 
     } 
} 

Die Search ist eine Klasse mit Eigenschaften, die durchsucht werden muss.

public class SearchRequest 
{ 

    public String FullTextSearch { get; set; } 

    public SearchEnums.FullTextSearchOperator FullTextOperator { get; set; } 

} 

Für Object intializer Syntax, können Sie es auf diese Weise verwenden:

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

Sie können auch verweisen: https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/bool-query-usage.html

Verwandte Themen