内部对象上的ElasticSearch聚合

时间:2016-05-26 10:51:08

标签: elasticsearch

在我的ES中,我有一个这样的模式类型:

{
  "index_v1":{
    "mappings":{
      "fuas":{
        "properties":{
          "comment":{
            "type":"string"
          },
          "matter":{
            "type":"string"
          },
          "metainfos":{
            "properties":{
              "department":{
                "type":"string"
              },
              "processos":{
                "type":"string"
              }
            }
          }
        }
      }
    }
  }
}

很快,fuas类型有两个属性commentmatter以及一个内部(非嵌套)对象metainfos,其中包含多个属性department和{{1} }}

我想知道有多少processos被告知其出现次数。

想象一下文件metainfos' fields doc1metainfos: {department: "d1"} doc2

然后我想得到:metainfos: {department: "d2", processos: "p1"}

修改

作为一个内部对象,由于ES是无模式文档,因此'{department: 2, processos: 1}内部对象可以通知或不通知多个字段。

所以,metainfosdoc1's metainfos {field1: 1, field3: 3}以及doc2's metainfos {field2: 1, field4: 5}

我想得到:doc3's metainfos {field1:2, field4: 2, field5: 1}。我认为解决这个问题的主要问题是我如何能够找到我不知道存在的字段。

我测试了两个文件:

{field1: 2, field2: 1, field3: 1, field4: 2, field5: 1}

我用这个命令对此进行了测试:

{
  "hits":{
    "total":2,
    "max_score":1.0,
    "hits":[
      {
        "_source":{
          "matter":"FUA2",
          "comment":null,
          "metainfos":[
            {
              "department":"d1"
            }
          ]
        }
      },
      {
        "_source":{
          "matter":"FUA1",
          "comment":"vcvcvc",
          "metainfos":[
            {
              "department":"d1"
            },
            {
              "processos":"p1"
            }
          ]
        }
      }
    ]
  }
}

结果是:

curl -XGET 'http://localhost:9201/living_team/fuas/_search?pretty' -d '
{
  "size": 0,
  "aggregations" : {
    "followUpActivity.metainfo.department" : {
      "terms" : {
        "field" : "metainfos.*"
      }
    }
  }
}
'

2 个答案:

答案 0 :(得分:0)

您可以使用value_count aggregation

{
    "size": 0,
    "aggs" : {
        "dept" : { 
            "value_count" : { "field" : "metainfos.department" } 
        },
        "proc" : { 
            "value_count" : { "field" : "metainfos.processos" } 
        }
    }
}

答案 1 :(得分:0)

您需要使用嵌套字段,否则您的内部字段在metainfos对象中不会“一起”显示。

见这里:ElasticSearch aggregation over inner object