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), но я просто не могу обернуть вокруг себя голову.

Я пробовал следовать, надеясь, что он сначала начнет aggragate на 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": [] 
        } 
       } 
      ] 
     } 
     } 
    } 
} 

Я также попытался добавить вложенную термин фильтр, чтобы только посмотреть на oemItems, которые имеют manufacType 1 с помощью следующего запроса. Однако он возвращает объекты, в которых oemItems включает manufacType 1, что означает, что oemItems внутри продуктов по-прежнему содержит 1 или 0 manufacType. Я не вижу, как делают агрегат на этот ответ будет возвращать только oemItems.manufactorName где 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

Хорошее начало до сих пор. Просто попробуйте вот так:

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 или несколько. Таким образом, образы, возвращаемые запросом, будут включать объекты, которые также имеют тип manufactorType 1, в дополнение к 0, и когда я агрегирую на таких результатах, я получаю как manufacType 1, так и 0. Я предполагаю, что мне нужно будет добавить фильтр к агрегации , поэтому он возвращает только oemItems с manufacType 0? –

+0

Попробуйте, он должен работать, потому что вложенные поля - это разные документы. – Val

+0

Цените свою помощь Val. Я сделал, но ведра в test1 пустые –

Смежные вопросы