将 Elastic Search 数字字段转换为文本值
Posted
技术标签:
【中文标题】将 Elastic Search 数字字段转换为文本值【英文标题】:Translate Elastic Search numeric field to a text value 【发布时间】:2019-01-17 09:09:23 【问题描述】:我有一个 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;
【问题讨论】:
谢谢,这太完美了!您可以在def key
行中添加分号。它应该是def key = 's' + doc['statuscode'].value
【参考方案1】:
应该是
def reason = reasonMap[doc['statuscode']value];
它会在包含 150 个值的地图上表现良好。
【讨论】:
谢谢...这是应该改变的一件事,但不幸的是这还不够。我更新了帖子。 找到了正确的方法。感谢您的输入! :-)以上是关于将 Elastic Search 数字字段转换为文本值的主要内容,如果未能解决你的问题,请参考以下文章
将包含 LONGTEXT 字段的 MySQL 表索引到 Elastic Search
Elastic Search 基础——分析(Analysis)