我在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更新现有索引而不丢失任何数据吗???谢谢帮助。
3条答案
按热度按时间nkcskrwz1#
您无法更改字段类型,也无法移除任何现有字段,但可以向现有Map添加其他字段。以下是有关此操作的官方文档。ESv6和ESv8
下面是一个例子:
创建索引
更新Map
k3bvogb12#
要更新现有索引Map而不丢失数据,可以使用以下方法之一:
使用API创建具有新Map的新索引,并将数据从旧索引复制到新索引。
然后更改别名以指向新索引。
此方法可保留数据并允许您更改任何Map参数,但需要额外的磁盘空间和时间来重建索引。使用更新MapAPI添加新字段或更改某些受支持的字段
Map旧索引中现有字段的参数。此方法不需要重新编制索引或额外的磁盘空间,但对您可以更改的内容有一些限制。例如,您不能更改现有字段的字段类型或分析器。
使用spring-data-elasticsearch存储库使用Java代码执行上述方法之一。您可以在实体类上使用@Mapping注解指定新索引的Map,并使用ElasticsearchOperations.reindex()方法从
你也可以使用ElasticsearchOperations.putMapping()方法来更新你现有的索引Map。
41zrol4v3#
不能更改字段类型,也不能移除任何现有字段