模板文件无法在ElasticSearch

时间:2016-07-28 09:14:54

标签: elasticsearch

我有一个外部JSON模板文件要加载到ElasticSearch

这就是我的所作所为:

curl -XPUT 'http://localhost:9200/_template/mytemplate' -d @file.json

命令得到正确确认

不幸的是,在创建索引时,我的JSON文件中定义的规则未应用

修改

这是JSON文件

{
    "template" : "log-*",
    "settings": {
        "index": {
            "number_of_shards": 1,
            "number_of_replicas": 0
        }
    },
    "mappings": {
        "logEvent": {
            "properties": {
                "timeStamp": {
                    "type": "date",
                    "format": "dateOptionalTime"
                },
                "message": {
                    "type": "string"
                },
                "messageObject": {
                    "type": "object"
                },
                "exception": {
                    "type": "object"
                },
                "loggerName": {
                    "type": "string"
                },
                "domain": {
                    "type": "string"
                },
                "identity": {
                    "type": "string"
                },
                "level": {
                    "type": "string"
                },
                "className": {
                    "type": "string"
                },
                "fileName": {
                    "type": "string"
                },
                "lineNumber": {
                    "type": "long"
                },
                "fullInfo": {
                    "type": "string"
                },
                "methodName": {
                    "type": "string"
                },
                "fix": {
                    "type": "string"
                },
                "userName": {
                    "type": "string"
                },
                "threadName": {
                    "type": "string"
                },
                "hostName": {
                    "type": "string"
                }
            }
        }
    }
}

应该应用于匹配log-*的任何索引。其中一个索引是log-2016.07.28

模板指定lineNumber的类型。它应该将此类lineNumber字段的类型从默认string更改为long。我得到的是lineNumber作为string的文档。

这是退回的文件:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "log-2016.07.28",
      "_type" : "logEvent",
      "_id" : "AVYwvw-k6GHUP7T-sYlL",
      "_score" : 1.0,
      "_source" : {
        "timeStamp" : "2016-07-28T09:04:02.8994786Z",
        "message" : "Upload file operation took 600 ms",
        "messageObject" : { },
        "exception" : { },
        "loggerName" : "Reviewer.Web.WebApi.GroupsController",
        "domain" : "/LM/W3SVC/2/ROOT-1-131141667495593380",
        "identity" : "",
        "level" : "INFO",
        "className" : "Reviewer.Logger.MethodTimer",
        "fileName" : "MethodTimer.cs",
        "lineNumber" : "49",
        "fullInfo" : "MethodTimer.cs:49)",
        "methodName" : "Dispose",
        "fix" : "LocationInfo, UserName, Identity, Partial",
        "properties" : {
          "test" : "123",
          "log4net:HostName" : "GBWOTIOM68052D",
          "IP" : "::1",
          "log4net:Identity" : "",
          "log4net:UserName" : "CORP\\gianluca.ghettini",
          "log4net:ElapsedTime" : "600",
          "@timestamp" : "2016-07-28T09:04:02.8994786Z"
        },
        "userName" : "CORP\\gianluca.ghettini",
        "threadName" : "198",
        "hostName" : "GBWOTIOM68052D"
      }
    } ]
  }
}

你可以看到

"lineNumber" : "49",

仍然是string而不是long

1 个答案:

答案 0 :(得分:2)

您观察到的是文档来源(因为它已发送到ES),ES将永远不会更改它。如果您的源包含字符串值,您将看到一个字符串值,如果您的源包含数值,您将在源中看到一个数字值。

然而,数据索引的方式才是真正重要的。如果您的映射将给定字段声明为字符串,则源中的字段值(无论是数字,布尔值,字符串还是其他)将被索引为字符串。

如果你的映射声明一个给定的字段是一个数字,并且源中的字段值是一个字符串,那么ES将尝试将该字符串强制转换为一个数字,并且该数字将被编入索引,但中的字符串来源不会更改为数字

因此,在您的情况下,您将lineNumber作为字符串"49"发送,因此ES会将字符串"49"强制转换为数字49并将该数字编入索引,甚至但是,源仍将包含字符串"49"

总结一下,如果您真的想在源中看到一个数字,则需要发送一个数字,即"lineNumber": 49而不是"lineNumber": "49"