我有一个外部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
最佳答案
您观察到的是文档(发送给ES)的源,ES永远不会更改它。如果源包含字符串值,则将看到一个字符串值;如果源包含数字值,则将在源中看到一个数字值。
但是,对数据建立索引的方式才是真正重要的。如果映射将给定字段声明为字符串,则源中的字段值(无论是数字, bool(boolean) 值,字符串还是其他)都将被索引为字符串。
如果您的映射声明给定字段为数字,并且源中的字段值是字符串,则ES会尝试将字符串强制为数字,并且该数字将被索引,但是不会将源中的字符串作为索引。更改为数字。
因此,在您的情况下,您将lineNumber
作为字符串"49"
发送,因此ES会将字符串"49"
强制转换为数字49
并对该数字进行索引,即使源仍将包含字符串"49"
。
总结一下,如果您确实想在来源中看到一个数字,则需要发送一个数字,即"lineNumber": 49
而不是"lineNumber": "49"
关于elasticsearch - 模板文件在ElasticSearch中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38632010/