2016-08-30 6 views
4

Я хочу объединить свои документы по разным клавишам в поле «категории». Вот два документа:Агрегация Elasticsearch на разных клавишах

 "date": 1470271301, 
     "categories": { 
     "1": [blabla], 
     "2": [blala] 
     } 


     "date": 144343545, 
     "categories": { 
     "1": [blabla], 
     "2": [coco] 
     "3": [rat, saouth] 
     } 

Mapping для категорий:

"categories" : { 
    "properties" : { 
     "1" : { 
      "type" : "long" 

И я хочу получить что-то вроде этого:

"buckets" : [ { 
    "key" : "1", 
    "doc_count" : 2 
    }, { 
    "key" : "2", 
    "doc_count" : 2 
    { 
    "key" : "3", 
    "doc_count" : 1 
    } 

Есть хороший способ сделать это Whithout изменяя отображение моих документов?

+0

Был бы полезно, если вы разместите текущее отображение для категорий – keety

+0

отображения @keety вывешенных – felicienb

ответ

3

Для этой цели можно использовать мета-поле _field_names.

Запуск агрегата на этом, как показано в примере ниже, даст вам количество документов.

Пример:

put test/test/1 
{ 
    "date": 1470271301, 
     "categories": { 
     "1": ["blabla"], 
     "2": ["blala"] 
     } 
} 
put test/test/2 
{ 
    "date": 144343545, 
     "categories": { 
     "1": ["blabla"], 
     "2": ["coco"], 
     "3": ["rat", "saouth"] 
     } 
} 

POST test/_search 
{ 
    "size": 0, 
    "aggs": { 
     "field_documents": { 
     "terms": { 
      "field": "_field_names", 
      "include" : "categories.*", 
      "size": 0 
     } 
     } 
    } 
} 

Результат:

"aggregations": { 
     "field_documents": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "categories", 
       "doc_count": 2 
      }, 
      { 
       "key": "categories.1", 
       "doc_count": 2 
      }, 
      { 
       "key": "categories.2", 
       "doc_count": 2 
      }, 
      { 
       "key": "categories.3", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
+0

Это работает спасибо !! ;) – felicienb