更新现有索引的ElasticsearchMap

mnemlml8  于 2023-03-17  发布在  ElasticSearch
关注(0)|答案(3)|浏览(201)

我在Elastic中有一个现有的索引“my-index”。我正在尝试用新字段更新这个现有的索引而不丢失数据。
我还尝试使用RestHighLevelClient的.putMapping函数更新现有索引,但仍然出现如下错误
ElasticSearch异常[类型=Map器解析异常,原因=无法解析Map[_doc]:根Map定义具有不受支持的参数:...
下面是我现有索引的Map

{
  "mappings": {
    "_doc": {
      "properties": {
        "_class": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 420
            }
          }
        },
        "taskType": {
          "type": "integer"
        },
        "updateTime": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "workType": {
          "type": "integer"
        }
      }
    }
  }
}

我的期望指数是

{
  "mappings": {
    "_doc": {  
    "mappings": {
    "dynamic_templates": [
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      },
      {
        "dates": {
          "match_mapping_type": "date",
          "mapping": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
          }
        }
      }
    ],
      "properties": {
        "_class": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 420
            }
          }
        },
        "date": {
          "type": "long"
        },
        "favorite_color": {
          "type": "keyword"
        },
        "is_active": {
          "type": "boolean"
        },
        "number_float": {
          "type": "float"
        },
        "number_long": {
          "type": "long"
        },
        "taskType": {
          "type": "integer"
        },
        "updateTime": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "updatedDate": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "workType": {
          "type": "integer"
        }
      }
    }
  }
}

我可以使用spring-data-elasticsearch repository更新现有索引而不丢失任何数据吗???谢谢帮助。

nkcskrwz

nkcskrwz1#

您无法更改字段类型,也无法移除任何现有字段,但可以向现有Map添加其他字段。以下是有关此操作的官方文档。ESv6ESv8
下面是一个例子:
创建索引

PUT my_index 
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "properties": {
            "first": {
              "type": "text"
            }
          }
        },
        "user_id": {
          "type": "keyword"
        }
      }
    }
  }
}

更新Map

PUT my_index/_mapping/_doc
{
  "properties": {
    "name": {
      "properties": {
        "last": { 
          "type": "text"
        }
      }
    },
    "user_id": {
      "type": "keyword",
      "ignore_above": 100 
    }
  }
}
k3bvogb1

k3bvogb12#

要更新现有索引Map而不丢失数据,可以使用以下方法之一:
使用API创建具有新Map的新索引,并将数据从旧索引复制到新索引。
然后更改别名以指向新索引。
此方法可保留数据并允许您更改任何Map参数,但需要额外的磁盘空间和时间来重建索引。使用更新MapAPI添加新字段或更改某些受支持的字段
Map旧索引中现有字段的参数。此方法不需要重新编制索引或额外的磁盘空间,但对您可以更改的内容有一些限制。例如,您不能更改现有字段的字段类型或分析器。
使用spring-data-elasticsearch存储库使用Java代码执行上述方法之一。您可以在实体类上使用@Mapping注解指定新索引的Map,并使用ElasticsearchOperations.reindex()方法从
你也可以使用ElasticsearchOperations.putMapping()方法来更新你现有的索引Map。

41zrol4v

41zrol4v3#

不能更改字段类型,也不能移除任何现有字段

相关问题