2016-08-03 3 views
2

ES에서 두 개의 쿼리가 있습니다. 둘 다 동일한 문서 세트에서 처리 시간이 다릅니다. 둘 다 개념적으로 같은 일을하고 있습니다. 나는 의심의 여지가 없다.필터링 된 bool 대 Bool 쿼리 : elasticsearch

1-이 두 가지의 차이점은 무엇입니까? 2- 어느 것이 더 사용하기 적합합니까? 3- 둘 다 동일하면 왜 다르게 수행 하는가?

1. Filtered bool 
    { 
     "from": 0, 
     "size": 5, 
     "query": { 
     "filtered": { 
      "filter": { 
      "bool": { 
       "must": [ 
       { 
        "term": { 
        "called_party_address_number": "1987112602" 
        } 
       }, 
       { 
        "term": { 
        "original_sender_address_number": "6870340319" 
        } 
       }, 
       { 
        "range": { 
        "x_event_timestamp": { 
         "gte": "2016-07-01T00:00:00.000Z", 
         "lte": "2016-07-30T00:00:00.000Z" 
        } 
        } 
       } 
       ] 
      } 
      } 
     } 
     }, 
     "sort": [ 
     { 
      "x_event_timestamp": { 
      "order": "desc", 
      "ignore_unmapped": true 
      } 
     } 
     ] 
    } 

    2. Simple Bool 

    { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "called_party_address_number": "1277478699" 
       } 
      }, 
      { 
       "term": { 
       "original_sender_address_number": "8020564722" 
       } 
      }, 
      { 
       "term": { 
       "cause_code": "573" 
       } 
      }, 
      { 
       "range": { 
       "x_event_timestamp": { 
        "gt": "2016-07-13T13:51:03.749Z", 
        "lt": "2016-07-16T13:51:03.749Z" 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "from": 0, 
     "size": 10, 
     "sort": [ 
     { 
      "x_event_timestamp": { 
      "order": "desc", 
      "ignore_unmapped": true 
      } 
     } 
     ] 
    } 

매핑 :

{ 
    "ccp": { 
     "mappings": { 
     "type1": { 
      "properties": { 
       "original_sender_address_number": { 
        "type": "string" 
       }, 
       "called_party_address_number": { 
        "type": "string" 
       }, 
       "cause_code": { 
        "type": "string" 
       },    
       "x_event_timestamp": { 
        "type": "date", 
        "format": "strict_date_optional_time||epoch_millis" 
       }, 
       . 
       . 
       .    
      } 
     } 
     } 
    } 
} 

업데이트 1 : 나는 데이터의 동일한 세트에 부울/쿼리해야이 부울/필터 쿼리했지만, 나는 이상한 행동을 발견

1- bool/must 쿼리가 원하는 검색어를 검색 할 수 있습니다. 불리언/필터 문서를 검색 할 수는 없지만

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "called_party_address_number": "8701662243" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "401" 
      } 
     } 
     ] 
    } 
    } 
} 

2- 문서화. I 번째 필드 조건을 삭제하는 경우는 (401)과 같은 2 필드의 값

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "called_party_address_number": "8701662243" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "401" 
      } 
     } 
     ] 
    } 
    } 
} 

갱신 2와 같은 레코드를 검색한다

BOOL 득점 위상을 억제하는 용액/내에 배치하여 쿼리해야 발견 "constant_score". "1235235757"와 "cause_code": "304"우리가 "called_party_address_number"가 일치하도록 노력하고있다

{ 
    "query": { 
    "constant_score": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "called_party_address_number": "1235235757" 
       } 
      }, 
      { 
       "term": { 
       "cause_code": "304" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

기록.

답변

3

첫 번째 것은 이전 1.x 쿼리/필터 구문을 사용합니다 (예 : filtered 검색어는 bool/filter으로 대체되었습니다).

두 번째 것은 새로운 2.x 구문을 사용하지만 필터 컨텍스트에서는 사용하지 않습니다. 즉 bool/filter 대신 bool/must을 사용하고 있습니다. (빠른 = 점수 계산하지 않고 필터 컨텍스트에서 실행 예) 첫 번째 질의에 해당 2.X 구문 쿼리는 것이 하나

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "called_party_address_number": "1277478699" 
      } 
     }, 
     { 
      "term": { 
      "original_sender_address_number": "8020564722" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "573" 
      } 
     }, 
     { 
      "range": { 
      "x_event_timestamp": { 
       "gt": "2016-07-13T13:51:03.749Z", 
       "lt": "2016-07-16T13:51:03.749Z" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "from": 0, 
    "size": 10, 
    "sort": [ 
    { 
     "x_event_timestamp": { 
     "order": "desc", 
     "ignore_unmapped": true 
     } 
    } 
    ] 
} 
+0

흥미롭게도 두 번째는 헤드 plugin.Thanks에 의해 생성되는 . – Mudit

+0

둘 다 유효하지만, 쿼리 컨텍스트에서 (점수 계산과 함께 더 느린) 'must'가있는 첫 번째 명령이 실행되는 반면, 'filter'가있는 두 번째 명령은 점수를 매길 필요가없는 경우 최적화의 일종입니다. – Val

+0

나는 이것을 위해 점수를 매길 필요가 없습니다. 너 한테 제안한 건가. 빠른 도움을 제공해 주셔서 감사합니다. – Mudit