Elasticsearch学习(四)

Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段。如果已经在线上运行着,我们想修改mapping字段的类型或者结构,那我们该怎么做呢?如果数据量小,可以快速删除索引,并重新构建新的索引,然后再把数据同步到索引中。如果数据量非常庞大,显然这种方式存在问题。如何不停服务重建索引是我们要考虑的问题。当我们的程序访问索引库时,考虑使用别名来访问,而不要使用真正的indexName。我们可以重新再构建一个新的索引,然后在索引更完数据之后,修改之前的别名即可。

创建别名

curl -XPOST localhost:9200/_aliases -d '
{
     "actions": [
        {"add": {"index":"test","alias": "test-aliases"}}
        ]
    }'

索引结构

{
  "test" : {
    "aliases" : {
      "test-aliases" : { }
    },
    "mappings" : {
      "user" : {
        "properties" : {
          "account" : { "type" : "string", "index" : "not_analyzed" },
          "avatar" : { "type" : "string", "index" : "not_analyzed" },
          "createdTimestamp" : { "type" : "date", "format" : "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1473248589616",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "eX_Wr45-Q3KBfoijNV_UXw",
        "version" : {
          "created" : "2020199" }
      }
    },
    "warmers" : { }
  }
}

待更新索引

新建索引test_v1(本次只修改account字段类型)。

{
  "test" : {
    "aliases" : {
      "test-aliases" : { }
    },
    "mappings" : {
      "user" : {
        "properties" : {
          "account" : { "type" : "integer" },
          "avatar" : { "type" : "string", "index" : "not_analyzed" },
          "createdTimestamp" : { "type" : "date", "format" : "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1473248589616",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "eX_Wr45-Q3KBfoijNV_UXw",
        "version" : {
          "created" : "2020199" }
      }
    },
    "warmers" : { }
  }
}

然后把数据同步到test_v1索引。

修改别名

"actions": [
      {"remove": {"index":"test","alias": "test-aliases"}},
      {"add": {"index":"test-v1","alias": "test-aliases"}}
        ]
    }

然后查看别名test-aliases对应的mapping,满足期望效果。

{
  "test_v1" : {
    "aliases" : {
      "test-aliases" : { }
    },
    "mappings" : {
      "user" : {
        "properties" : {
          "account" : { "type" : "integer" },
          "avatar" : { "type" : "string", "index" : "not_analyzed" },
          "createdTimestamp" : { "type" : "date", "format" : "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1473305627645",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "DTlK4py3Tcy-2LNruLWGAw",
        "version" : {
          "created" : "2020199" }
      }
    },
    "warmers" : { }
  }
}

别名test-aliases实际指向的是test-v1。如果数据一切OK了,就可以删除原来的索引test

你可能感兴趣的:(搜索)