以两种不同的类型进行聚合并将其归还给Elasticsearch

时间:2016-10-24 08:34:00

标签: elasticsearch

将此映射分为两种类型items_oneitems_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 个答案:

答案 0 :(得分:0)

终于解决了。脚本可以解决这个问题:

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