Создание агрегатов двух разных типов и возврат их сгруппированными в Elasticsearch

#elasticsearch

#elasticsearch

Вопрос:

Имея это сопоставление с двумя типами, items_one и items_two :

 curl -XPUT 'localhost:9200/tester?pretty=true' -d '{
  "mappings": {
      "items_one": {
         "properties" : {
           "type" : {"type": "string",
                     "index": "not_analyzed"}
        }},
      "items_two": {
         "properties" : {
           "other_type" : { "type": "string",
                     "index": "not_analyzed"}
}}}}'
  

Я поместил два элемента в items_one :

 curl -XPUT 'localhost:9200/tester/items_one/1?pretty=true' -d '{
    "type": "Bank transfer"
}'

curl -XPUT 'localhost:9200/tester/items_one/2?pretty=true' -d '{
    "type": "PayPal"
}'
  

… и еще два в items_two :

 curl -XPUT 'localhost:9200/tester/items_two/1?pretty=true' -d '{
    "other_type": "Cash"
}'

curl -XPUT 'localhost:9200/tester/items_two/2?pretty=true' -d '{
    "other_type": "No pay"
}'
  

Как я могу создать агрегаты в двух разных полях и вернуть их сгруппированными?

Я знаю, что могу получить это из одного поля, выполнив:

 curl -XGET 'localhost:9200/tester/_search?pretty=true' -d '{
    "size": 0,
    "aggs": {
        "paying_types": {
            "terms": {
                "field": "type"
            }
        }
    }
}'
  

Но я не могу сделать это «многополевым», создавая что-то подобное (что не работает):

 curl -XGET 'localhost:9200/tester/_search?pretty=true' -d '{
    "size": 0,
    "aggs": {
        "paying_types": {
            "terms": {
                "field": ["type", "other_type"]
            }
        }
    }
}'
  

Мой желаемый результат должен быть:

   "aggregations" : {
    "paying_types" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "Bank transfer",
        "doc_count" : 1
      }, {
        "key" : "PayPal",
        "doc_count" : 1
      }, {
        "key" : "Cash",
        "doc_count" : 1
      }, {
        "key" : "No pay",
        "doc_count" : 1
      } ]
    }
  }
}
  

Заранее спасибо

Ответ №1:

Наконец-то решил это. Скрипт сделает свое дело:

 curl -XGET 'localhost:9200/tester/_search?pretty=true' -d '{
    "size": 0,
    "aggs": {
        "paying_types": {
            "terms": {
                 "script": "doc['type'].values   doc['other_type'].values"
            }
        }
    }
}'