2016-06-21 2 views
0

내부 개체가있는 데이터를 집계하려고합니다. 예를 들어 :ElasticSearch 1x - 개체 조건에 대한 집계

{ 
    "_index": "product_index-en", 
    "_type": "elasticproductmodel", 
    "_id": "000001111", 
    "_score": 6.3316255, 
    "_source": { 
     "productId": "11111111111", 
     "productIdOnlyLetterAndDigit": "11111111111", 
     "productIdOnlyDigit": "11111111111", 
     "productNumber": "11111111111", 
     "name": "Glow Plug", 
     "nameOnlyLetterAndDigit": "glowplug", 
     "productImageLarge": "11111111111.jpg", 
     "itemGroupId": "11111", 
     "relatedProductIds": [], 
     "dataAreaCountries": [ 
      "fra", 
      "pol", 
      "uk", 
      "sie", 
      "sve", 
      "atl", 
      "ita", 
      "hol", 
      "dk" 
     ], 
     "oemItems": [ 
      { 
       "manufactorName": "BERU", 
       "manufacType": "0" 
      }, 
      { 
       "manufactorName": "LUCAS", 
       "manufacType": "0" 
      } 
     ] 
    } 
} 

내가 할 수 집계 oemItems.manufactorName 값이 될 필요가 있지만 oemItems.manufacType은 "0"입니다. 여기에 수락 된 예 (Elastic Search Aggregate into buckets on conditions)와 같은 많은 예제를 시도했지만, 그저 내 머리를 감쌀 수없는 것 같습니다.

필자는 manufacType을 먼저 수행하고, 각 유형에 대해 manufactorName을 사용하여 올바른 적중 횟수를 표시하는 것으로 보았습니다. 그러나 manufactorName 버킷이 비어 있습니다

GET /product_index-en/_search 
{ 
"size": 0, 
    "aggs": { 
    "baked_goods": { 
     "nested": { 
     "path": "oemItems" 
     }, 
     "aggs": { 
     "test1": { 
      "terms": { 
      "field": "oemItems.manufacType", 
      "size": 500 
      }, 
      "aggs": { 
      "test2": { 
       "terms": { 
       "field": "oemItems.manufactorName", 
       "size": 500 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

그리고 결과 :

{ 
    "took": 27, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 471214, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "baked_goods": { 
     "doc_count": 677246, 
     "test1": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
        "key": "0", 
        "doc_count": 436557, 
        "test2": { 
        "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
        "buckets": [] 
        } 
       }, 
       { 
        "key": "1", 
        "doc_count": 240689, 
        "test2": { 
        "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
        "buckets": [] 
        } 
       } 
      ] 
     } 
     } 
    } 
} 

가 나는 또한 단지 쿼리를 다음과 같이 manufacType 일이있는 oemItems 볼에, 중첩 된 용어 필터를 추가하기 위해 노력했다. 그러나 oemItems에 manufacType 1이 포함되어있는 객체를 반환합니다. 즉, 제품 내의 oemItems에는 여전히 1 또는 0 개의 manufacType이 있습니다. 나는 oemItems.manufacType 지금까지 0

GET /product_index-en/_search 
{ 
     "query" : { "match_all" : {} }, 
     "filter" : { 
      "nested" : { 
       "path" : "oemItems", 
       "filter" : { 
        "bool" : { 
         "must" : [ 
          { 
           "term" : {"oemItems.manufacType" : "1"} 
          } 
         ] 
        } 
       } 
      } 
     }  
} 
+0

먼저 'oemItems'가 매핑에'중첩 된'유형인지 확인해야합니다. 그럴까요? – Val

+0

@Val 아니요, 중첩 형식이 아닙니다. 나는 그것을 바꿀 것이고 그것이 도움이되는지 알게 될 것이다. –

+0

@Val 중첩 된 것으로 설정하고 내 게시물에 예제를 추가했습니다. –

답변

1

좋은 시작이다이 응답에 대한 집계를 수행하는 경우에만 oemItems.manufactorName을 반환하는 방법을 볼 수 없습니다. 이것을 다음과 같이 시도해보십시오.

POST /product_index-en/_search 
{ 
    "size": 0, 
    "query": { 
    "nested": { 
     "path": "oemItems", 
     "query": { 
      "term": { 
       "oemItems.manufacType": "0" 
      } 
     } 
    } 
    }, 
    "aggs": { 
    "baked_goods": { 
     "nested": { 
     "path": "oemItems" 
     }, 
     "aggs": { 
     "test1": { 
      "terms": { 
      "field": "oemItems.manufactorName", 
      "size": 500 
      } 
     } 
     } 
    } 
    } 
} 
+0

문제는 Object.oemItems는 manufacType이 1, 0 또는 multiple 중 하나 인 객체를 포함 할 수 있다는 것입니다. 따라서 쿼리에 의해 반환 된 히트에는 0 이외에 manufactorType 1을 가진 Objects가 포함될 것입니다. 그런 결과에 대해 집계 할 때 manufacType 1과 0으로 끝납니다. 집계에 필터를 추가해야한다고 생각합니다. , 그래서 manufacType 0을 가진 oemItems 만 반환합니까? –

+0

중첩 된 필드가 아래에있는 별개의 문서이므로 시도해보십시오. – Val

+0

도움 감사 Val. 나는했으나 test1의 버킷은 비어 있습니다. –