对象或键值对上的Elasticsearch聚合

时间:2019-10-10 19:13:28

标签: elasticsearch elastic-stack elasticsearch-aggregation elasticsearch-query elasticsearch-mapping

我有这样的文件

document-1

{
  "edges" :[
    {
      "start" : "abc", 
      "end" : "def"
    },
    {
      "start" : "bbb", 
      "end" : "ccc"
    },
    {
      "start" : "xyz", 
      "end" : "aaa"
    }
  ]
}

document-2

{
  "edges" :[
    {
      "start" : "abc", 
      "end" : "def"
    },
    {
      "start" : "bbb", 
      "end" : "ccc"
    }
  ]
}

我想获得startend的唯一组合。 即如下

{
  "buckets": [
    {
      "key": {
        "start": "abc",
        "end": "def"
      },
      "doc_count": 2
    },
    {
      "key": {
        "start": "bbb",
        "end": "ccc"
      },
      "doc_count": 2
    },
    {
      "key": {
        "start": "xyz",
        "end": "aaa"
      },
      "doc_count": 1
    }
  ]
}

我在startend字段上尝试了术语聚合。但没有得到预期的输出。

1 个答案:

答案 0 :(得分:1)

您需要使用nested数据类型,因为数组是平坦的,因为docs中对数组进行了很好的描述。这就是为什么keyvalue之间的关系丢失而无法获得预期结果的原因。此外,您随后需要在edges上添加nested聚合,然后可以在其中应用terms聚合。 聚合的层次结构应如下所示:

nested: edge
    terms: key
        terms: value

基于此,然后可以通过组合术语聚合的结果来产生预期的结果。