2016-11-13 3 views
0

Я строй запроса эластичных 5 (используя гнездо в .net), я пытаюсь для того чтобы достигнуть этого результата:Multiple должен опрашивает незаменимый запрос

должен иметь значение 1 и значение 2

должен иметь Value3 или значение 4

и должны иметь value5 или 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

В вашем запросе bool может быть только одно предложение 'should'. На мой взгляд, один из ваших статей должен быть отклонен. Почему бы не поместить все совпадения 'should' в одно предложение' should'? – Val

+0

Так как мне нужно значение value3 или value4 И либо значение5, либо значение6 –

ответ

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; } 
} 
Смежные вопросы