将Elastic Search数字字段转换为文本值

时间:2018-08-09 19:53:51

标签: kibana dashboard elasticsearch-painless

我有一个包含大量漂亮数据的Elastic Search集群,为此我创建了一些漂亮的Kibana仪表板。

在下一级别,我决定查看脚本化字段,以使某些仪表板更加美观。

我想将一些数字字段转换为更易于理解的文本值。作为我想做的事和尝试过的事的示例,我将使用http响应状态代码字段,大多数人将很容易理解,但也可以说明问题。

我们记录数字状态代码(200、201、302、400、404、500等)。我可以创建一个数据表可视化,告诉我这些状态代码的计数。但是我想在仪表板上显示文本原因。

我可以使用很多IF语句来创建一个轻松的脚本,

if (doc['statuscode'].value == 200) {return "OK";}
if (doc['statuscode'].value == 201) {return "Created";}
if (doc['statuscode'].value == 400) {return "Bad Request";}
return doc['statuscode'].value;

但是我认为那不是很好。

但是由于我很可能会拥有大约150个不同的值,并且该列表不会经常更改,因此我可以维持一个静态地图。但是我还没有找到在无痛脚本中实现地图或字典的示例。

我正在考虑实现这样的东西:

Map reasonMap;
reasonMap[200] = 'OK';
reasonMap[201] = 'Created';

def reason = reasonMap[doc['statuscode'].value];
if (reason != null)
{
   return reason;
}

return doc['statuscode'].value;

虽然我无法使此代码正常工作。问题还在于,这对于最多包含150个值的地图是否足够好。

谢谢

编辑

经过反复试验和大量的搜索,这就是我想出的方法(请注意,键必须以字符而不是数字开头):

def reasonMap = 
[
  's200': 'OK',
  's201': 'Created'
];
def key = 's' + doc['statuscode'].value

def reason = reasonMap[key];
if (reason != null)
{
   return reason;
}

return doc['statuscode'].value;

1 个答案:

答案 0 :(得分:0)

应该是

def reason = reasonMap[doc['statuscode']value];

在150个值的地图上,效果会很好。