2015-12-08 3 views
1

У меня есть отдельный документ в поиске elastics для каждого продукта. Каждый продукт имеет уникальный PRODUCTID и неуникальныйидентификатор_группы вместе с другими атрибутами, например: категории.Уникальный атрибут elasticsearch для каждой группы.

Я хочу, чтобы иметь возможность объединить различные атрибуты с их подсчетом на уникального GroupID

пример:

документ 1:

{ 
    "productId": 123 
    "groupId" xyz, 
    "categories": [{"value": "shoes"}, {"value": "t-shirt"}] 
} 

документ 2:

{ 
    "productId": 345 
    "groupId" xyz, 
    "categories": [{"value": "shoes"}, {"value": "t-shirt"}] 
} 

doc 3:

{ 
    "productId": 456 
    "groupId" abc, 
    "categories": [{"value": "t-shirt"}] 
} 

документ 4:

{ 
    "productId": 567 
    "groupId" abc, 
    "categories": [{"value": "shoes"}, {"value": "makeup"}] 
} 

ожидаемые результаты, что-то вроде:

  • обувь: 2
  • футболки: 2
  • макияж: 1

поэтому я хочу кол каждый пункт один раз, если он существует с тем же GroupID

мой запрос:

{ 
    "from":0, 
    "size":0, 
    "query":{ 
    "filtered":{ 
     "filter":{ 

     } 
    } 
    }, 
    "aggs": { 
    "group": { 
     "terms": {"field": "group"}, 
     "aggs": { 
     "brand": { 
      "terms": {"field": "productMeta.brand.value"} 
     } 
     } 
    } 
    } 
} 

ответ:

{ 
    "took": 6, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 25, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "group": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 3, 
     "buckets": [ 
     { 
      "key": "wlmr34210507", 
      "doc_count": 8, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "generic", 
       "doc_count": 8 
       } 
      ] 
      } 
     }, 
     { 
      "key": "wlmr19524441", 
      "doc_count": 4, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "maybelline", 
       "doc_count": 4 
       } 
      ] 
      } 
     }, 
     { 
      "key": "wlmr34121549", 
      "doc_count": 2, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "maybelline", 
       "doc_count": 2 
       } 
      ] 
      } 
     }, 
     { 
      "key": "wlmr34317301", 
      "doc_count": 2, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "dream on me", 
       "doc_count": 2 
       } 
      ] 
      } 
     }, 
     { 
      "key": "bbfs40549552", 
      "doc_count": 1, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "samsung", 
       "doc_count": 1 
       } 
      ] 
      } 
     }, 
     { 
      "key": "bobb7937347", 
      "doc_count": 1, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "chicco", 
       "doc_count": 1 
       } 
      ] 
      } 
     }, 
     { 
      "key": "wlmr24241413", 
      "doc_count": 1, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "maybelline", 
       "doc_count": 1 
       } 
      ] 
      } 
     }, 
     { 
      "key": "wlmr27504560", 
      "doc_count": 1, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "mr. beer", 
       "doc_count": 1 
       } 
      ] 
      } 
     }, 
     { 
      "key": "wlmr33986448", 
      "doc_count": 1, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "mr. beer", 
       "doc_count": 1 
       } 
      ] 
      } 
     }, 
     { 
      "key": "wlmr40806575", 
      "doc_count": 1, 
      "brand": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
       "key": "healthtex", 
       "doc_count": 1 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

ответ

0

Использование вложенных elasticsearch Условия Агрегации так же, как и в настоящее время с брендами, вы можете создавать выходные данные таким образом:

"aggregations": { 
    "groups": { 
     "buckets": [ 
     { 
      "key": "xyz", 
      "categories_per_group": { 
      "buckets": [ 
       { 
       "key": "shoes", 
       "doc_count": 2 
       }, 
       { 
       "key": "t-shirt", 
       "doc_count": 2 
       } 
      ] 
      } 
     }, 
     { 
      "key": "abc", 
      "categories_per_group": { 
      "buckets": [ 
       { 
       "key": "shoes", 
       "doc_count": 1 
       }, 
       { 
       "key": "t-shirt", 
       "doc_count": 1 
       }, 
       { 
       "key": "makeup", 
       "doc_count": 1 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 

Это может можно написать pipeline bucket script (ES 2.x) для сбора подсчета различных категорий по группе ведер, как вы предлагаете.

Но, вероятно, проще и быстрее реализовать эту сокращающую логику самостоятельно, используя выше приведенные выше значения агрегатных ковшей.

+0

аха звук круто, я попробую это. спасибо любая идея, как в ES aggs я могу только вернуть размер ведра? –

1

поэтому в основном я был в состоянии решить эту проблему с помощью мощности следующим образом:

{ 
     "from":0, 
     "size":0, 
     "query":{ 
     "filtered":{ 
      "filter":{ 
      } 
     } 
     }, 
     "sort":{ 
     "ts":{ 
      "order":"desc", 
      "mode":"max", 
      "ignore_unmapped":true 
     } 
     }, 
     "aggs":{ 
     "categories":{ 
      "terms":{ 
       "field":"productMeta.brand.value", 
       "size":0 
      }, 
      "aggs": { 
       "category" : { 
        "cardinality" : { 
         "field" : "group" 
        } 
       } 
      } 
     } 
     } 
    } 

результатов уникального счетчика на PRODUCTID в категория:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 71, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "categories": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "chocolate", 
      "doc_count": 23, 
      "category": { 
      "value": 23 
      } 
     }, 
     { 
      "key": "notebook", 
      "doc_count": 9, 
      "category": { 
      "value": 1 
      } 
     }, 
     { 
      "key": "olive_oil", 
      "doc_count": 7, 
      "category": { 
      "value": 7 
      } 
     }, 
     { 
      "key": "physical_training", 
      "doc_count": 5, 
      "category": { 
      "value": 5 
      } 
     }, 
     { 
      "key": "ski", 
      "doc_count": 5, 
      "category": { 
      "value": 2 
      } 
     }, 
     { 
      "key": "gym_membership", 
      "doc_count": 4, 
      "category": { 
      "value": 4 
      } 
     }, 
     { 
      "key": "ski_boots", 
      "doc_count": 4, 
      "category": { 
      "value": 1 
      } 
     }, 
     { 
      "key": "vinegar", 
      "doc_count": 4, 
      "category": { 
      "value": 4 
      } 
     }, 
     { 
      "key": "bracelet", 
      "doc_count": 3, 
      "category": { 
      "value": 3 
      } 
     }, 
     { 
      "key": "handbags", 
      "doc_count": 2, 
      "category": { 
      "value": 2 
      } 
     }, 
     { 
      "key": "cider", 
      "doc_count": 1, 
      "category": { 
      "value": 1 
      } 
     }, 
     { 
      "key": "ice_cider", 
      "doc_count": 1, 
      "category": { 
      "value": 1 
      } 
     }, 
     { 
      "key": "jewelry_1", 
      "doc_count": 1, 
      "category": { 
      "value": 1 
      } 
     }, 
     { 
      "key": "laces", 
      "doc_count": 1, 
      "category": { 
      "value": 1 
      } 
     }, 
     { 
      "key": "stationery", 
      "doc_count": 1, 
      "category": { 
      "value": 1 
      } 
     } 
     ] 
    } 
    } 
} 
+1

Отличное использование мощности! –