2013-11-25 3 views
0

다음 쿼리와 같이 중첩 AND/OR 쿼리 문자열을 얻으려면 다른 부울 쿼리 내에서 여러 must/should가있는 부울 쿼리를 중첩합니다.elasticsearch의 다른 부울 쿼리 내에서 중첩 된 부울 쿼리 수행

{ 
    "query": { 
    "bool": { 
     "should": [ 
     **// SHOULD BLOCK 1** 
     { 
      <should_query_1> 
     }, 
     **// SHOULD BLOCK 2** 
     { 
      <should_query_2> 
     }, 
     **// SHOULD BLOCK 3** 
     { 
      "bool": { 
      "must": [ 
       <should_level_2_MUST_query_1>, 
       <should_level_2_MUST_query_2>, 
      { 
     "bool": { 
      "must": [ 
      <should_level_3_MUST_query_1>, 
      <should_level_3_MUST_query_2>, 
      ]   
     } 
      } 
      ] 
      } 
     }, 
     **// SHOULD BLOCK 4** 
     { 
      "bool": { 
      "must": [ 
       <should_MUST_query_1>, 
       <should_MUST_query_2> 
      ] 
      } 
     } 
     ] 
    } 
    }, 
    "size": 25, 
    "from": 0, 
    "fields": [] 
} 

예상되는 동작 내가 블록 1,2,3,4 'OR 연산을하고, 내가 할 수있는 "Should_level_2_MUST_queries를"원하는 "3을 차단해야"내'해야 논리적을 요구해 원이다.

그러나 실제로 나는 3 & 4 '첫 번째 수준에 AND 연산하는 블록은 블록 자체와 OR 연산 1 & 2. 나이 (가)를 달성하기 위해이 쿼리를 다시 작성/나를 다시 정렬 도와주세요해야 구문을 사용하고 있습니다 예상되는 행동. 사전

답변

1

AFAIK, elasticsearch에서

덕분에 부울 대수에서 같은 및/또는 레벨을 가지고 있겠지. 결국에는 항상 한 수준이 있습니다.

쿼리에서 기본적으로 "나는 3 개의 쿼리가 필요합니다"라고 말하면 3 개의 쿼리가 결합 된 결과가 최종 응답에 포함되어야합니다.

내가 제대로 이해하면, 예상되는 동작에 도달하려면 다음을 수행해야합니다

  • 변환 모든 필요한 것까지해야
  • 이 필요 및 N은 정수
  • 이고 그 shoulds에게 "minumum_should_match:N" 규칙을 넣으면

가이드 :

+0

오늘 감사합니다. – Baaju