使用脚本在嵌套字段上进行简单(非嵌套)多字段术语聚合

时间:2018-04-06 21:19:31

标签: elasticsearch

据我所知,如果我们在嵌套字段上执行简单(非嵌套)聚合,它会为每个存储桶提供父文档的计数(该嵌套字段是属性的文档)。而不是嵌套文档的计数。

假设: 现在我有以下映射:

{
    "properties": {
      "openPort":{
        "type":"nested",
        "include_in_parent":true,
        "properties":{
          "port":{
            "type":"integer"
          },
          "protocol":{
            "type":"text",
            "fields":{
              "keyword":{
                "type":"keyword",
                "ignore_above":256
              }
            }
          }
        }
      }
}
} 

现在我想找到 1.(端口,协议)的所有可能组合。 2.这些组合的总数。 3.每个组合的外部文件数量。

因此,为了达到(1和2),以下没有给出正确的结果:

{
    "aggs" : {
        "multi_field_cardinality" : {
            "cardinality" : {
                "script": {
                    "inline": "doc['openPort.port'].value + '#' + doc['openPort.protocol.keyword'].value"
                },
                "precision_threshold":4000
            }
        },
        "multi_field_terms" : {
            "terms" : {
                "script": {
                    "inline": "doc['openPort.port'].value + '#' + doc['openPort.protocol.keyword'].value"
                },
                "size":4000
            }
        }
    }
}

不准确之处在于:它不包括(端口,协议)的所有组合。

但是以下嵌套的agg包括所有:

{
    "aggs" : {
        "count_multi-field":{
            "nested":{
                "path":"openPort"
            },
            "aggs":{
                "multi_field_cardinality" : {
                    "cardinality" : {
                        "script": {
                            "inline": "doc['openPort.port'].value + '#' + doc['openPort.protocol.keyword'].value"
                        },
                        "precision_threshold":4000
                    }
                },
                "multi_field_terms" : {
                    "terms" : {
                        "script": {
                            "inline": "doc['openPort.port'].value + '#' + doc['openPort.protocol.keyword'].value"
                        },
                        "size":1000
                    }
                }
            }
        }
    }
}

请帮助我理解原因。

0 个答案:

没有答案