elasticsearch 使用ElasticSearch'删除重复文档;s聚集,elasticsearch,groovy,elasticsearch,Groovy" /> elasticsearch 使用ElasticSearch'删除重复文档;s聚集,elasticsearch,groovy,elasticsearch,Groovy" />

elasticsearch 使用ElasticSearch'删除重复文档;s聚集

elasticsearch 使用ElasticSearch'删除重复文档;s聚集,elasticsearch,groovy,elasticsearch,Groovy,我有这三份弹性文件,如下所示 { "@timestamp": "2017-04-20T09:01:55.232Z", "outer": { "sequence": "44304", "reference": "1.2.3.4", "inner": { "first": { "reference": "moduleA", "identity": "

我有这三份弹性文件,如下所示

{
    "@timestamp": "2017-04-20T09:01:55.232Z",
    "outer": {
        "sequence": "44304",
        "reference": "1.2.3.4",
        "inner": {
            "first": {
                "reference": "moduleA",
                "identity": "mouduleA-alarm"
            }
        }
    }
}

{
    "@timestamp": "2017-04-20T09:01:54.232Z",
    "outer": {
        "sequence": "44304",
        "reference": "1.2.3.4",
        "inner": {
            "first": {
                "reference": "moduleA",
                "identity": "mouduleA-alarm"
            }
        }
    }
}

{
    "@timestamp": "2017-04-20T09:01:57.232Z",
    "outer": {
        "sequence": "44304",
        "reference": "1.2.3.4",
        "inner": {
            "second": {
                "reference": "moduleA",
                "identity": "mouduleA-alarm"
            }
        }
    }
}
我正在对这些文档进行查询,然后对它们进行聚合。在聚合中,根据三个字段删除重复文档。 查询如下所示:

{
    "aggs": {
        "dedup": {
            "terms": {  
                "script":"[doc['outer.reference'].value, doc['outer.inner.first.reference'].value, doc['outer.inner.first.identity'].value].join('_')",
                "lang": "groovy",
                "valueType": "string"
            },
            "aggs": {
                "dedup_docs": {
                    "top_hits": {
                        "size": 1
                    }
                }
            }
        }
    }
}
上面的查询工作正常,但问题是内部块中容器的名称是动态的,即它们可以是第一个第二个等等。但是我需要访问参考内部块中的标识,以进行聚合

我尝试在脚本中使用正则表达式,但没有成功

{
    "aggs": {
        "dedup": {
            "terms": {  
                "script":"[doc['outer.reference'].value, doc[/'outer.inner..+.reference'/].value, doc[/'outer.inner..+.identity'/].value].join('_')",
                "lang": "groovy",
                "valueType": "string"
            },
            "aggs": {
                "dedup_docs": {
                    "top_hits": {
                        "size": 1
                    }
                }
            }
        }
    }
}
上述查询引发“找不到值”异常

注:Elastic中的映射是动态模板,所有字段均为非分析字段


谢谢。

在脚本中,您可以找到第一个键,然后动态使用它

这样做应该可以:

def array = [doc['outer.reference'].value]; 
def key = doc['outer.inner'].keySet().iterator.next();
array << doc['outer.inner'][key]['reference'].value;
array << doc['outer.inner'][key]['identity'].value;
return array.join('_')
def数组=[doc['outer.reference'].value];
def key=doc['outer.inner'].keySet().iterator.next();
数组这对我有效

def array = [_source.outer.reference]; 
def key = _source.outer.inner.keySet().iterator.next();
array << _source.outer.inner[key]['reference'];
array << _source.outer.inner[key]['identity'];
return array.join('_')
def数组=[\u source.outer.reference];
def key=_source.outer.inner.keySet().iterator.next();

数组谢谢Val,我可以在文件中编写此脚本,并从ElasticSearch的配置中选择该文件。但是有没有一种方法可以在一行中编写这段代码,这样我就可以使用内联脚本而不是从脚本文件中提取。这就是为什么我添加了分号,只是删除了新行字符。出于可读性的考虑,我添加了它们。幸运的是吗?我无法取出内部块的键集。这是因为一个单一的列表吗?我可以访问doc['outer.internal.first.reference'],但无法获取任何容器的密钥集。您能告诉我您有哪个版本的ES吗?