2016-11-13 43 views
0

我建立一個查詢彈性5(使用.NET鳥巢),我試圖實現這一目標的結果查詢:多應該必須查詢

必須有值1和值2

應該有值3或者價值4

,應該有值5或value6

這裏是我的查詢:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "code": { 
       "query": "value1" 
      } 
      } 
     }, 
     { 
      "match": { 
      "code": { 
       "query": "value2" 
      } 
      } 
     } 
     ], 
     "should": [ 
     { 
      "match": { 
      "code": { 
       "query": "value3" 
      } 
      } 
     }, 
     { 
      "match": { 
      "code": { 
       "query": "value4" 
      } 
      } 
     } 
     ], 
     "should": [ 
     { 
      "match": { 
      "code": { 
       "query": "value5" 
      } 
      } 
     }, 
     { 
      "match": { 
      "code": { 
       "query": "value6" 
      } 
      } 
     } 
     ], 
     "minimum_should_match": 1 
    } 
    } 
} 

我沒有得到想要的答案(比如我沒有任何地方值5和值6,但仍然得到結果)

謝謝

+0

您的布爾查詢中只能有一個'應該'子句。在我看來,你的一個條款應該被解僱。爲什麼不把所有「應該」匹配放在一個「應該」條款中? – Val

+0

因爲我需要value3或value4和value5或value6 –

回答

3

然後,你需要這樣的事:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "code": { 
       "query": "value1" 
      } 
      } 
     }, 
     { 
      "match": { 
      "code": { 
       "query": "value2" 
      } 
      } 
     }, 
     { 
      "bool": { 
      "minimum_should_match": 1, 
      "should": [ 
       { 
       "match": { 
        "code": { 
        "query": "value3" 
        } 
       } 
       }, 
       { 
       "match": { 
        "code": { 
        "query": "value4" 
        } 
       } 
       } 
      ] 
      } 
     }, 
     { 
      "bool": { 
      "minimum_should_match": 1, 
      "should": [ 
       { 
       "match": { 
        "code": { 
        "query": "value5" 
        } 
       } 
       }, 
       { 
       "match": { 
        "code": { 
        "query": "value6" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 
+0

這是否工作? – Val

0

這裏的NEST相當於Val's answer

void Main() 
{ 
    var client = new ElasticClient(); 

    client.Search<MyDocument>(s => s 
     .Query(q => q 
      .Bool(b => b 
       .Must(mu => mu 
        .Match(m => m 
         .Field(f => f.Code) 
         .Query("value1") 
        ), mu => mu 
        .Match(m => m 
         .Field(f => f.Code) 
         .Query("value2") 
        ), mu => mu 
        .Bool(bb => bb 
         .MinimumShouldMatch(1) 
         .Should(sh => sh 
          .Match(m => m 
           .Field(f => f.Code) 
           .Query("value3") 
          ), sh => sh 
          .Match(m => m 
           .Field(f => f.Code) 
           .Query("value4") 
          ) 
         ) 
        ), mu => mu 
        .Bool(bb => bb 
         .MinimumShouldMatch(1) 
         .Should(sh => sh 
          .Match(m => m 
           .Field(f => f.Code) 
           .Query("value5") 
          ), sh => sh 
          .Match(m => m 
           .Field(f => f.Code) 
           .Query("value6") 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ); 
} 

public class MyDocument 
{ 
    public string Code { get; set; } 
}