2016-11-10 2 views
0

J'ai une requête booléenne que je veux ajouter dynamiquement à l'utilisation de la syntaxe de l'objet intializer mais j'ai du mal à le faire. Fondamentalement, j'ai 5 étapes de vérification des paramètres, et si elles existent, ils sont ajoutés à la boolquery. Voici ce que je suis en train de faire (ne fonctionne évidemment pas):elasticsearch nest 2 ajouter dynamiquement à la requête booléenne

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

Comment puis-je faire le travail ci-dessus pour que je puisse ajouter dynamiquement des requêtes au BoolQuery? Non, je ne peux pas le faire via ce:

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

Parce que je ne sais pas combien de requêtes que je vais avoir et je ne peux pas les ajouter à la fois. J'ai besoin d'une solution dynamique.

Je pensais peut-être ceci:

SomeBoolQueryContainer &= someQuery; 

puis à la fin:

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

Mais cela semble un peu redondant pour dire le moins. Des idées?

EDIT: La dernière option essayée ci-dessus ne semble pas fonctionner. ne renvoie aucun résultat.

Répondre

0

Ajout requête bool dynamiquement en utilisant l'API Courant:

 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 
      }); 
     } 
} 

Le SearchRequest est un ayant des propriétés de classe qui doit être recherchée.

public class SearchRequest 
{ 

    public String FullTextSearch { get; set; } 

    public SearchEnums.FullTextSearchOperator FullTextOperator { get; set; } 

} 

Object intializer syntaxe, vous pouvez l'utiliser de cette façon:

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

Vous pouvez également consulter: https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/bool-query-usage.html