2016-07-28 66 views
0

不工作我有一个外部JSON模板文件加载到ElasticSearch模板文件中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

那么你怎么指标,什么是错的,即"lineNumber": 49呢? – alpert

+0

你能告诉你如何索引你的日志文件吗?请显示一个示例文档。 – Val

+0

我刚刚添加了一个示例文档,我想要什么,而我实际得到的是什么 –

回答

2

您注意到的是对的源文件(因为它被发送到ES)和ES永远不会改变它。如果您的来源包含字符串值,则会看到一个字符串值,如果您的来源包含数字值,则会在来源中看到一个数字值。

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

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

所以,你的情况,你送lineNumber为字符串"49",所以ES将强制字符串"49"到数49和索引号,即使源尚将包含字符串"49"

概括起来讲,如果你真的想看到你的源数字,你需要发送一些"lineNumber": "49"

+0

辉煌!有没有办法知道我是否得到了“正确”的类型?有没有可能向ES查询这些信息? –

+0

我的意思是,我的方式来实际验证该领域内部得到正确的类型 –

+0

相信您的映射和ES做它的工作;当然 – Val