嵌套聚合Elasticsearch中的条件路径

时间:2018-02-27 17:43:34

标签: elasticsearch path conditional

我有一个带有两个属性的嵌套字段:

{
    "rating": 2
    "victim": [{
        "ip":  "...",
        "instanceId": "....""
    }]
}

我希望聚合评分并获取每个文档的IP或InstanceId,而不是两者都在存储桶列表中。

到目前为止我得到的是:

"__rating": {
    "terms": {"field": "rating"},
    "aggs": {
        "__hosts": {
            "nested": {"path": "victim"},
            "aggs": {
                "ips": {"terms": {"field": "victim.ip"} } ,
                "instances": {"terms": {"field": "victim.instanceId"} }
            }
        }
    }
}

以上聚合为我提供了两个领域的存储桶,但我需要一个或其他。

感谢。

2 个答案:

答案 0 :(得分:0)

您需要在elasticsearch中使用源过滤。在查询顶部添加以下代码:

{
  "csv|false|false|1" => [
  MyApp::Model::SendDestination @values = {
    ... # I removed the unnecessary key-values for demo purposes
    :address => "3", # this should be "1"
    ...
  }],
  "csv|false|false|2" => [
  MyApp::Model::SendDestination @values = {
    ...
    :address => "3", # this should be "2"
    ...
  }],
  "csv|false|false|3" => [
  MyApp::Model::SendDestination @values = {
    ...
    :address => "3", # this is correct
    ...
  }]
}

如果您想了解有关源过滤的更多详细信息,请check this out

答案 1 :(得分:0)

经过大量的搜索,我找到了通过无痛脚本来做到这一点的方法:

"terms" : {
    "script" : {
        "source": "doc['victim.instanceId'].value == null ? doc['victim.ip'] : doc['victim.instanceId']",
        "lang": "painless"
    },
    "missing": "N/A"
}