2016-11-13 42 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; } 
}