在某些业务的使用场景下,您可能需要对索引的一些字段进行重命名。例如,使用DataWorks在阿里云Elasticsearch集群间迁移数据时,由于源集群数据中包含了特殊符号(例如@),而DataWorks不支持特殊符号,因此需要修改字段名(去掉特殊符号)后再进行数据迁移。本文介绍如何通过Logstash修改字段名。

背景信息

您可以通过两种方式修改字段名:
  • 使用Logstash的filter,对字段进行重命名。

    本文采用此方式,以去除源索引字段的@符号为例进行演示。即将源索引字段@ctxt_user_info,重命名为目标索引字段ctxt_user_info

  • 使用Reindex迁移时,对字段进行重命名。

前提条件

您已完成以下操作:

  • 创建阿里云Elasticsearch实例。

    具体操作,请参见创建阿里云Elasticsearch实例,本文以7.10版本实例为例。

  • 创建阿里云Logstash实例,需要与Elasticsearch实例在同一专有网络下。

    具体操作,请参见创建阿里云Logstash实例

  • 准备测试数据
    本文使用的测试数据如下。可以看到源索引字段@ctxt_user_info中包含@字符。
    {
      "took" : 5,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 6,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "product_info",
            "_type" : "_doc",
            "_id" : "rpN7fn0BKQKHRO31rK6C",
            "_score" : 1.0,
            "_source" : {
              "@ctxt_user_info" : "test1"
            }
          },
          {
            "_index" : "product_info",
            "_type" : "_doc",
            "_id" : "r5N7fn0BKQKHRO31rK6C",
            "_score" : 1.0,
            "_source" : {
              "@ctxt_user_info" : "test2"
            }
          }
        ]
      }
    }

操作流程

  1. 步骤一:创建目标索引(可选)
  2. 步骤二:创建并配置Logstash管道
  3. 步骤三:验证结果

步骤一:创建目标索引(可选)

如果您开启了Elasticsearch的自动创建索引功能,可忽略此步骤。
说明 自动创建的索引可能不符合您的预期,不建议开启。
  1. 登录目标阿里云Elasticsearch实例的Kibana控制台。
    具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 7.10版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 根据页面提示进入Kibana主页,单击右上角的Dev tools
  3. Console页签,执行以下脚本,创建目标索引product_info2
    PUT /product_info2
    {
        "settings": {
            "number_of_shards": 5,
            "number_of_replicas": 1
        },
        "mappings": {
            "properties": {
                "ctxt_user_info": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }

步骤二:创建并配置Logstash管道

  1. 登录阿里云Elasticsearch控制台
  2. 进入目标实例。
    1. 在顶部菜单栏处,选择地域。
    2. 在左侧导航栏,单击Logstash实例,然后在Logstash实例中单击目标实例ID。
  3. 在左侧导航栏,单击管道管理
  4. 管道列表区域,单击创建管道
    创建管道
  5. 创建管道任务页面,输入管道ID并配置管道。
    本文使用的管道配置如下。
    input {
        elasticsearch {
            hosts => ["http://es-cn-tl32gid**********.elasticsearch.aliyuncs.com:9200"]
            user => "elastic"
            password => "your_password"
            index => "product_info"
            docinfo => true
        }
    }
    filter {
        mutate {
            rename => { "@ctxt_user_info" => "ctxt_user_info" }
        }
    }
    output {
        elasticsearch {
            hosts => ["http://es-cn-tl32gid**********.elasticsearch.aliyuncs.com:9200"]
            user => "elastic"
            password => "your_password"
            index => "product_info2"
            document_type => "%{[@metadata][_type]}"
            document_id => "%{[@metadata][_id]}"
        }
    }
                            

    以上管道配置中,通过Logstash的filter.mutate.rename参数实现索引的重命名。

    更多管道配置说明,请参见通过配置文件管理管道Logstash配置文件说明

  6. 单击保存或者保存并部署
    • 保存:将管道信息保存在Logstash里并触发实例变更,配置不会生效。保存后,系统会返回管道管理页面。可在管道列表区域,单击操作列下的立即部署,触发实例重启,使配置生效。
    • 保存并部署:保存并且部署后,会触发实例重启,使配置生效。

步骤三:验证结果

  1. 登录目标阿里云Elasticsearch的Kibana控制台。
    具体操作请参见登录Kibana控制台
  2. 根据页面提示进入Kibana主页,单击右上角的Dev tools
  3. Console页签,执行以下脚本,查询目标索引中的信息。
    GET product_info2/_search

    返回结果如下。

    {
      "took" : 4,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 6,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "product_info2",
            "_type" : "_doc",
            "_id" : "r5N7fn0BKQKHRO31rK6C",
            "_score" : 1.0,
            "_source" : {
              "@timestamp" : "2021-12-03T04:14:26.872Z",
              "@version" : "1",
              "ctxt_user_info" : "test1"
            }
          },
          {
            "_index" : "product_info2",
            "_type" : "_doc",
            "_id" : "rpN7fn0BKQKHRO31rK6C",
            "_score" : 1.0,
            "_source" : {
              "@timestamp" : "2021-12-03T04:14:26.871Z",
              "@version" : "1",
              "ctxt_user_info" : "test2"
            }
          }
        ]
      }
    }

    根据结果可以看到,源索引字段@ctxt_user_info中的@已经去除,索引字段被重命名为ctxt_user_info