我刚刚开始使用ElasticSearch(v1.5)scripted_metric
聚合,并且在尝试使用example aggregation from the documentation时已经发现了。
在我从脚本中找到access the elasticsearch logger的方法后,结果发现只调用了init_script
和reduce_script
,map_script
和combine_script
即使在将脚本简化为仅仅记录之后,也会被省略。
[...]
"aggs": {
"test": {
"scripted_metric": {
"init_script" : "import org.elasticsearch.common.logging.*; ESLogger logger=ESLoggerFactory.getLogger('myscript');logger.error('1')",
"map_script" : "import org.elasticsearch.common.logging.*; ESLogger logger=ESLoggerFactory.getLogger('myscript');logger.error('2')",
"combine_script" : "import org.elasticsearch.common.logging.*; ESLogger logger=ESLoggerFactory.getLogger('myscript');logger.error('3')",
"reduce_script" : "import org.elasticsearch.common.logging.*; ESLogger logger=ESLoggerFactory.getLogger('myscript');logger.error('4')"
}
}
}
[...]
日志
[2015-08-04 08:31:31,841][ERROR][myscript ] 1
[2015-08-04 08:31:31,841][ERROR][myscript ] 1
[2015-08-04 08:31:31,843][ERROR][myscript ] 1
[2015-08-04 08:31:31,844][ERROR][myscript ] 1
[2015-08-04 08:31:31,845][ERROR][myscript ] 1
[2015-08-04 08:31:32,020][ERROR][myscript ] 4
以前,我开始使用doc示例的略微修改版本:
[...]
"aggs": {
"test": {
"scripted_metric": {
"init_script" : "_agg['transactions'] = []",
"map_script" : "_agg.transactions.add(2)",
"combine_script" : "profit = 0; for (t in _agg.transactions) { profit += t }; return profit",
"reduce_script" : "profit = 0; for (a in _aggs) { profit += a }; return profit"
}
}
}
[...]
由引起的ReduceSearchPhaseException
失败的
[Ambiguous method overloading for method java.lang.Integer#plus.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
[class java.lang.Character]
[class java.lang.String]
[class java.lang.Number]]
这是因为在reduce_script
中,_aggs
数组由五个null
组成,如果map_script
和combine_script
不运行,则完全有意义。
但为什么他们不跑?任何深入挖掘的想法都会受到赞赏。
答案 0 :(得分:0)
如果应用过于严格的过滤器以便找不到文档,则会发生这种情况。在我的情况下,bool
过滤器隐藏在我的邮递员的首页,我花了一些时间才意识到 - 抱歉,这是一个多么愚蠢的错误: - /
显然,在空搜索结果中map
和combine
没有任何内容。