2014-04-01 2 views
6

ES 데이터베이스에 여러 회사 데이터가 있습니다. 각 문서의 수를 가져 오려고합니다.하지만 집계 쿼리에 문제가 있습니다. 나는 "법인"또는 "회사"와 같은 용어를 제외하려고합니다. 지금까지 아래 코드에 따라 한 번에 한 번에 성공적으로이 작업을 수행 할 수있었습니다. Elasticsearch Aggregation Query (복수 제외 포함)

"aggregations": { 
    "assignee": { 
     "buckets": [ 
      { 
       "key": "inc", 
       "doc_count": 375 
      }, 
      { 
       "key": "company", 
       "doc_count": 252 
      } 
     ] 
    } 
} 

가 이상적으로는

{ 
    "aggs" : { 
     "companies" : { 
      "terms" : { 
       "field" : "Companies.name", 
       "exclude" : ["corporation", "inc.", "inc", "co", "company", "the", "industries", "incorporated", "international"], 
      } 
     } 
    } 
} 

처럼 뭔가를 할 수 있도록하고 싶습니다하지만하지 않는 방법을 찾을 수 없어 반환

{ 
    "aggs" : { 
     "companies" : { 
      "terms" : { 
       "field" : "Companies.name", 
       "exclude" : "corporation" 
      } 
     } 
    } 
} 

오류가 발생했습니다

ES 문서에서 Aggregation의 "Terms"섹션을 살펴본 결과 ex 하나의 제외에 대한 충분한. 나는 여러 용어를 제외 할 수 있다면 궁금해. 그렇다면 올바른 구문이 무엇인지.

참고 : 필드를 "not_analyzed"로 설정하고 분할 된 이름이 아닌 전체 회사 이름으로 그룹화 할 수 있음을 알고 있습니다. 그러나, 나는 분석으로 이렇게 주저 해요 당신이 철저하게 모든 선택 사항을 나열하는 정규 표현식을 사용할 수 있도록 버킷, 이름 변화 (즉, 마이크로 소프트 사 &는 Microsoft Corporation)

+1

,이는 ES 1.5으로 구현되었습니다. 자세한 내용은이 문제를 참조하십시오. https://github.com/elastic/elasticsearch/issues/11959 –

답변

10

exclude parameter is a regular expression 더 관대 할 수 있습니다 :

"exclude" : 
    "corporation|inc\\.|inc|co|company|the|industries|incorporated|international" 

일반적으로이 작업을 수행하는 경우 값 (예 : .)을 이스케이프 처리해야합니다. 일반적으로 생성되지 않은 경우 그룹화하여 일부를 단순화 할 수 있습니다 (예 : inc\\.?inc\\.|inc, 더 복잡한 것은 co(mpany|rporation)?). 이것이 많이 실행된다면 추가 된 복잡성이 성능에 어떤 영향을 주는지 테스트하는 것이 좋습니다.

또한 적용 할 수있는 flags (선택 사항)이 있습니다. 이는 Java Pattern에있는 옵션입니다. 편리하게 올 수있는 것은 CASE_INSENSITIVE입니다.

따라서 영업 이익 배열 구문은 이제 유효하며 예상대로 유효한 일반에 추가 (작동 현재 목록 항목의 exclude 정확히 일치하는 지원 배열 :

"exclude" : { 
    "pattern" : "...expression as before...", 
    "flags" : "CASE_INSENSITIVE" 
}