我有一个外部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
答案 0 :(得分:2)
您观察到的是文档来源(因为它已发送到ES),ES将永远不会更改它。如果您的源包含字符串值,您将看到一个字符串值,如果您的源包含数值,您将在源中看到一个数字值。
然而,数据索引的方式才是真正重要的。如果您的映射将给定字段声明为字符串,则源中的字段值(无论是数字,布尔值,字符串还是其他)将被索引为字符串。
如果你的映射声明一个给定的字段是一个数字,并且源中的字段值是一个字符串,那么ES将尝试将该字符串强制转换为一个数字,并且该数字将被编入索引,但中的字符串来源不会更改为数字。
因此,在您的情况下,您将lineNumber
作为字符串"49"
发送,因此ES会将字符串"49"
强制转换为数字49
并将该数字编入索引,甚至但是,源仍将包含字符串"49"
。
总结一下,如果您真的想在源中看到一个数字,则需要发送一个数字,即"lineNumber": 49
而不是"lineNumber": "49"