Elasticsearch将数字值显示为字符串

时间:2015-09-24 05:55:17

标签: elasticsearch

我发现弹性搜索中的轰鸣声数据使我感到困惑:

 {
    "_index": "statsd-2015.09.24",
    "_type": "counter",
    "_id": "AU__eqbL4jN5fst_IEyK",
    "_score": 1,
    "_source": {
       "ns": "statsd",
       "grp": "bad_lines_seen",
       "tgt": "",
       "act": "",
       "val": 0,
       "@timestamp": 1443072093000
    }
 },
 {
    "_index": "statsd-2015.09.24",
    "_type": "counter",
    "_id": "AU__fKQM4jN5fst_IEy_",
    "_score": 1,
    "_source": {
       "ns": "statsd",
       "grp": "bad_lines_seen",
       "tgt": "",
       "act": "",
       "val": "0",
       "@timestamp": "1443072852000"
    }
 }

为什么字段 val 时间戳以不同的格式显示?

  • 在第一份文件中,它们是数字
  • 在第二个文档中,它们是字符串

它们的索引和类型相同,其映射为:

{
   "statsd-2015.09.24": {
      "mappings": {
         "counter": {
            "properties": {
               "@timestamp": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },
               "act": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "grp": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "ns": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "tgt": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "val": {
                  "type": "long"
               }
            }
         }
      }
   }
}

这怎么可能?

2 个答案:

答案 0 :(得分:2)

您发现文档的来源中的字段类型之间存在差异。 FK是提交给ElasticSearch以索引文档的原始JSON。

但是,它并不是实际索引的内容:这只是为了其他目的而存储的(更多信息可以在documentation中找到)。

在您的情况下,_source被映射为val字段,因此第二个文档中提供的字符串值实际上被解析为其长值。

您可以轻松地检查:尝试索引像这样的文档

long

您将遇到以下解析错误:

{
  "ns": "statsd",
  "grp": "bad_lines_seen",
  "tgt": "",
  "act": "",
  "val": "abc",
  "@timestamp": "1443072852000"
}

所以,回答你的问题:你的价值观'类型是不同的,但实际上由于解析,这些值都被编入索引为MapperParsingException[failed to parse [val]]; nested: NumberFormatException[For input string: \"abc\"];

答案 1 :(得分:0)

有关其他信息:

输出:{"@timestamp": "2019-03-21T10:52:35.435Z"}

索引映射:"@timestamp": {"type": "date"}


输出:{"@timestamp": 1443072852000}

索引映射:"@timestamp": {"type": "date","format": "epoch_millis"}