2016-07-22 100 views
0

我有這個彈性搜索查詢,它以原始格式完美工作,我無法將其轉換爲C#NEST子句。Elasticsearch嵌套查詢具有多個必備子句的布爾過濾器

這是原始查詢:

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

而這就是我想在C#NEST將工作:

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

用戶可以發送x值的數組,這意味着每個值必須有:

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

「bool」查詢的'必要'子句是一個數組;我懷疑第二個「必須」條款屬性將最終覆蓋第一個。你使用的是哪個版本的NEST? –

+0

我正在使用最新版本。 2.3.x我認爲是。 – McBoman

回答

1

這樣的事情會起作用

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

將產生

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

這利用了operator overloading for QueryContainer允許它們是&&「編在一起以形成bool查詢與must子句。

+0

該代碼不會運行。它似乎不能運行術語f => f.Ingredients,因爲它無法找到成分。 – McBoman

+0

該示例假定您有一個名爲'Ingredients'的屬性名爲'Recipe'的POCO類型。您需要根據您的型號對其進行相應調整 –

+0

找出你需要的東西。謝謝您的幫助。它效果很好! – McBoman

相關問題