【问题标题】:How to change field types for existing index using Elasticsearch Mapping API如何使用 Elasticsearch Mapping API 更改现有索引的字段类型
【发布时间】:2016-08-23 12:35:35
【问题描述】:

我正在使用ELK 并具有以下文档结构

 {
  "_index": "prod1-db.log-*",
  "_type": "db.log",
  "_id": "AVadEaq7",
  "_score": null,
  "_source": {
    "message": "2016-07-08T12:52:42.026+0000 I NETWORK  [conn4928242] end connection 192.168.170.62:47530 (31 connections now open)",
    "@version": "1",
    "@timestamp": "2016-08-18T09:50:54.247Z",
    "type": "log",
    "input_type": "log",
    "count": 1,
    "beat": {
      "hostname": "prod1",
      "name": "prod1"
    },
    "offset": 1421607236,
    "source": "/var/log/db/db.log",
    "fields": null,
    "host": "prod1",
    "tags": [
      "beats_input_codec_plain_applied"
    ]
  },
  "fields": {
    "@timestamp": [
      1471513854247
    ]
  },
  "sort": [
    1471513854247
  ]
} 

我想将message 字段更改为not_analyzed。我想知道如何使用Elasticsedarch Mapping API 来实现这一目标?比如如何使用PUT Mapping API给现有索引添加新类型?

我正在使用Kibana 4.5Elasticsearch 2.3

更新 在logstash 中尝试了以下template.json

 1 {
 2   "template": "logstash-*",
 3   "mappings": {
 4     "_default_": {
 5       "properties": {
 6         "message" : {
 7           "type" : "string",
 8           "index" : "not_analyzed"
 9         }
10       }
11     }
12   }
13 }

启动logstash时出现以下错误,

logstash_1       | {:timestamp=>"2016-08-24T11:00:26.097000+0000", :message=>"Invalid setting for elasticsearch output plugin:\n\n  output {\n    elasticsearch {\n      # This setting must be a path\n      # File does not exist or cannot be opened /home/dw/docker-elk/logstash/core_mapping_template.json\n      template => \"/home/dw/docker-elk/logstash/core_mapping_template.json\"\n      ...\n    }\n  }", :level=>:error}
logstash_1       | {:timestamp=>"2016-08-24T11:00:26.153000+0000", :message=>"Pipeline aborted due to error", :exception=>#<LogStash::ConfigurationError: Something is wrong with your configuration.>, :backtrace=>["/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/config/mixin.rb:134:in `config_init'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/outputs/base.rb:63:in `initialize'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/output_delegator.rb:74:in `register'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/pipeline.rb:181:in `start_workers'", "org/jruby/RubyArray.java:1613:in `each'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/pipeline.rb:181:in `start_workers'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/pipeline.rb:136:in `run'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/agent.rb:473:in `start_pipeline'"], :level=>:error}
logstash_1       | {:timestamp=>"2016-08-24T11:00:29.168000+0000", :message=>"stopping pipeline", :id=>"main"}

【问题讨论】:

    标签: elasticsearch kibana elastic-stack


    【解决方案1】:

    当索引已经存在时,您不能更改它的映射,除非您为对象或多字段创建新字段。

    如果您想为此使用 Mapping API,您的请求将如下所示:

    PUT /prod1-db.log-*/_mapping/log
    {
      "properties": {
        "message": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
    

    不过,我建议您使用映射创建一个 JSON 文件并将其添加到您的 logstash 配置中。

    模板文件可能如下所示(您需要自定义):

    {
      "template": "logstash-*",
      "mappings": {
        "_default_": {
          "properties": {
            "action" : {
              "type" : "string",
              "fields" : {
                "raw" : {
                  "index" : "not_analyzed",
                  "type" : "string"
                }
              }
            },
            "ad_domain" : {
              "type" : "string"
            },
            "auth" : {
              "type" : "long"
            },
            "authtime" : {
              "type" : "long"
            },
            "avscantime" : {
              "type" : "long"
            },
            "cached" : {
              "type" : "boolean"
            }
          }
        }
      }
    }
    

    Logstash 配置中的 elasticsearch 条目如下所示:

    elasticsearch {
        template => "/etc/logstash/template/template.json"
        template_overwrite => true
    }
    

    【讨论】:

    • 尝试了PUT /prod1-db.log-*/_mapping/log { "properties": { "message": { "type": "string", "index": "not_analyzed" } } },但从elasticsearch 收到错误,`java.lang.IllegalArgumentException:无效版本格式:{“PROPERTIES”:{“MESSAGE”:{“TYPE”:“STRING” , "INDEX": "NOT_ANALYZED"}}} HTTP/1.1`
    • @daiyue 你重建索引了吗?
    • 重新创建索引是什么意思?如何结合添加映射来做到这一点?
    • @daiyue 无法重新映射现有索引(某些预期除外)。映射仅适用于正在创建的索引。我会强烈建议您使用模板文件,因为这样您就不必处理 curl 并且可以非常轻松地编辑更改。
    • 是的。它定义了应该将映射应用到哪个索引。
    【解决方案2】:

    如果您在创建索引时没有为字段指定任何映射,那么当您第一次将文档索引到索引中时,弹性搜索会根据提供的数据自动为每个字段选择最佳映射。查看您在问题中提供的文档,elasticsearch 已经为message 字段分配了一个分析器。一旦分配,您将无法更改它。唯一的方法是创建一个新索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2017-12-14
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2017-01-07
      • 2020-11-24
      相关资源
      最近更新 更多