2016-07-28 53 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