elasticsearch - 模板文件在ElasticSearch中不起作用

标签 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

最佳答案

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

但是,对数据建立索引的方式才是真正重要的。如果映射将给定字段声明为字符串,则源中的字段值(无论是数字, bool(boolean) 值,字符串还是其他)都将被索引为字符串。

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

因此,在您的情况下,您将lineNumber作为字符串"49"发送,因此ES会将字符串"49"强制转换为数字49并对该数字进行索引,即使源仍将包含字符串"49"

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

关于elasticsearch - 模板文件在ElasticSearch中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38632010/

相关文章:

elasticsearch - 如何使用 Elasticsearch 更新进行原子增量?

ruby-on-rails - rails searchkick错误:找不到字段[word_middle]的分析器[searchkick_word_middle_index]

elasticsearch - 如何将 bool 查询与间隔查询或任何其他查询结合起来

elasticsearch - ElasticSearch 中的复合词处理 - 将 "splitted"和 "joined"形式视为相同

elasticsearch - 如何使用 NEST 客户端获取 Elasticsearch 服务器的版本?

php - 在 Elasticsearch 5 上使用过滤器获取嵌套文档

Elasticsearch 标准分词器行为和单词边界

c# - 如何使用NLog登录到Amazon ElasticSearch?

sql - ElasticSearch 用外键映射两个sql表

elasticsearch - 来自Logstash的Elasticsearch映射配置