2016-07-22 9 views
0

Ich habe diese elasticsearch Query, die perfekt in einem Rohformat funktioniert und ich habe Schwierigkeiten, es in eine C# NEST-Klausel zu verwandeln.ElasticSearch Nest Query Bool Filter mit mehreren Muss-Klauseln

Dies ist die rohe Abfrage:

{ 
"query":{ 
     "constant_score":{ 
     "filter":{ 
      "bool":{ 
       "must":{ 
        "term":{ 
        "ingredients":"baking" 
        } 
       }, 
       "must":{ 
        "term":{ 
        "ingredients":"soda" 
        } 
       } 
      } 
     } 
     } 
    } 
} 

Und das ist, was ich dachte, in NEST C# funktionieren würde:

public List<Recipe> FindByMultipleValues(string field, string[] values) { 
     List<string> vals = values.ToList(); 
     return client.Search<Recipe>(s => s 
      .Query(q => q 
       .Bool(fq => fq 
        .Filter(f => f 
         .Term(rec => rec.Ingredients, vals) 
        ) 
       ) 
      ) 
     ).Documents.ToList(); 
    } 

Der Benutzer eine Reihe von x-Werte können, die für das bedeutet schicken jeder Wert muss eine sein:

"must":{ 
    "term":{ 
     "ingredients":"soda" 
     } 
    } 
+0

Die 'must'-Klausel einer' bool'-Abfrage ist ein Array; Ich würde vermuten, dass die zweite 'must'-Klausel-Eigenschaft am Ende die erste überschreiben wird. Welche Version von NEST verwenden Sie? –

+0

Ich verwende die neueste Version. 2.3.x denke ich es ist. – McBoman

Antwort

1

So etwas wie dies funktionieren wird

var terms = new[] { "baking", "soda" }; 

client.Search<Recipe>(s => s 
    .Query(q => q 
     .ConstantScore(cs => cs 
      .Filter(csf => 
      { 
       var firstTerm = csf.Term(f => f.Ingredients, terms.First());   
       return terms.Skip(1).Aggregate(firstTerm, (query, term) => query && csf.Term(f => f.Ingredients, term)); 
      }) 
     ) 
    ) 
); 

nachgeben

{ 
    "query": { 
    "constant_score": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "ingredients": { 
        "value": "baking" 
       } 
       } 
      }, 
      { 
       "term": { 
       "ingredients": { 
        "value": "soda" 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Dieser Vorteil von operator overloading for QueryContainer nimmt, die sie && ‚zusammen eine bool Abfrage mit must Klauseln bilden ed sein können.

+0

Dieser Code wird nicht ausgeführt. Es scheint, dass es den Begriff f => f.Ingredients nicht ausführen kann, weil es keine Zutaten finden kann. – McBoman

+0

In diesem Beispiel wird davon ausgegangen, dass Sie einen POCO-Typ namens "Rezept" mit einer Eigenschaft namens "Zutaten" haben. Sie müssen es entsprechend Ihrem Modell anpassen –

+0

Herausgefunden, was Sie betrafen. Danke für die Hilfe. Es hat super funktioniert! – McBoman

Verwandte Themen