如何在不破坏elasticsearch中的数据的情况下更改架构?

时间:2017-03-10 06:37:22

标签: elasticsearch

这是我当前的架构

{
    "mappings": {
      "historical_data": {
        "properties": {
          "continent": {
            "type": "string",
            "index": "not_analyzed"
          },
          "country": {
            "type": "string",
            "index": "not_analyzed"
          },
          "description": {
            "type": "string"
          },
          "funding": {
            "type": "long"
          },
          "year": {
            "type": "integer"
          },
          "agency": {
            "type": "string"
          },
            "misc": {
            "type": "string"
          },
          "university": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
}

我上传了700k条记录。在不破坏数据的情况下,如何才能使大学索引“未被分析”,以便更改反映在我现有的数据中?

2 个答案:

答案 0 :(得分:2)

无法修改现有字段的映射。 但是,您可以通过两种方式实现预期的结果。

  1. 创建另一个字段。使用put _mapping API
  2. 可以免费添加字段
    curl -XPUT localhost:9200/YOUR_INDEX/_mapping -d '{
      "properties": {
        "new_university": {
          "type": "string"
        }
      }
    }'
    
    1. 使用multi-fields,在not_analyzed字段中添加一个子字段。
    2. curl -XPUT localhost:9200/YOUR_INDEX/_mapping -d '{
          "properties": {
              "university": {
                  "type": "string",
                  "index": "not_analyzed",
                  "fields": {
                      "university_analyzed": {
                          "type": "string" // <-- ANALYZED sub field
                      }
                  }
              }
          }
      }'
      

      在这两种情况下,您需要重新索引才能填充新字段。使用_reindex API

      curl -XPUT localhost:9200/_reindex -d '{
        "source": {
          "index": "YOUR_INDEX"
        },
        "dest": {
          "index": "YOUR_INDEX"
        },
        "script": {
          "inline": "ctx._source.university = ctx._source.university"
        }
      }'
      

答案 1 :(得分:0)

你并没有被迫&#34;销毁&#34;您的数据,您可以做的是重新索引您的数据,如this article中所述(我不会扯掉这些示例,因为它们在零停机时间重新索引您的数据部分中特别清楚)。

对于重建索引,您还可以查看reindexing API,最简单的方法是:

POST _reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}

当然,执行此操作需要一些资源,因此我建议您仔细查看要在映射中引入的更改,并在您的活动量最少时执行操作服务器(例如在周末或晚上......)