表达式中使用的字段[]在映射中不存在

时间:2016-05-18 13:05:34

标签: elasticsearch kibana elastic-stack

我尝试填充的功能是在kibana中创建一个度量标准,显示“未经验证”的用户数。 我发送用户注册时发送的日志,然后发送用户验证时的日志。

所以我想要的计数是注册人数和经过验证的人数之间的差异。

在kibana,我不能做这样的数学运算,所以我找到了一个解决方法: 我添加了一个名为“unvalidated”的“脚本字段”,当用户注册时它等于1,而当用户验证他的帐户时则为-1。 “未经验证”字段的总和应该是未经验证的用户数。

这是我在脚本字段中定义的脚本: doc['ctxt_code'].value == 1 ? 1 : doc['ctxt_code'].value == 2 ? -1 : 0

使用:

  • ctxt_code 1作为注册日志

  • ctxt_code 2作为验证日志

当我的所有日​​志都有“ctxt_code”时,此设置很有效,但是当没有此字段的日志被推送时,kibana会抛出以下错误:

Field [ctxt_code] used in expression does not exist in mappings kibana error

我无法理解这个错误,因为kibana说:

If a field is sparse (only some documents contain a value), documents missing the field will have a value of 0

情况就是这样。

任何人都有线索?

1 个答案:

答案 0 :(得分:2)

没有ctxt_code字段的日志就可以了......但是你必须在索引中有这个字段的映射。我看到你用logstash-*查询了多个索引,所以你可能会找到一个没有它的索引。

您可以在所有索引中包含您的字段的映射。只需进入Sense并使用:

PUT logstash-*/_mappings/[your_mapping_name]
{
  "properties": {
    "ctxt_code": {
      "type": "short",           // or any other numeric type, including dates
      "index": "not_analyzed"    // Only works for non-analyzed fields.
    }
  }
}

如果您愿意,可以从命令行执行此操作:CURL -XPUT 'http://[elastic_server]/logstash-*/_mappings/[your_mapping_name]' -d '{ ... same JSON ... }'