e.f*_*.a. 7 bigdata elasticsearch elasticsearch-mapping
无论如何我可以重命名现有的elasticsearch映射中的元素而无需添加新元素吗?如果是这样,为了避免破坏现有的映射,最好的方法是什么?
例如,从fieldCamelcase到fieldCamelCase
{
"myType": {
"properties": {
"timestamp": {
"type": "date",
"format": "date_optional_time"
},
"fieldCamelcase": {
"type": "string",
"index": "not_analyzed"
},
"field_test": {
"type": "double"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Byr*_*ach 11
您可以通过创建一个Ingest管道来实现这一点,该管道包含Rename处理器和Reindex API.
PUT _ingest/pipeline/my_rename_pipeline
{
"description" : "describe pipeline",
"processors" : [
{
"rename": {
"field": "fieldCamelcase",
"target_field": "fieldCamelCase"
}
}
]
}
POST _reindex
{
"source": {
"index": "source"
},
"dest": {
"index": "dest",
"pipeline": "my_rename_pipeline"
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要运行Elasticsearch 5.x才能使用摄取.如果你正在运行<5.x那么你将不得不使用@Val在评论中提到的内容:)
首先,您必须了解elasticsearch和lucene如何通过不可变段存储数据(您可以在互联网上轻松阅读)。
因此,任何解决方案都将删除/创建文档并更改映射或创建新索引,以便创建新映射。
最简单的方法是使用update by queryAPI: https: //www.elastic.co/guide/en/elasticsearch/reference/2.4/docs-update-by-query.html
POST /XXXX/_update_by_query
{
"query": {
"missing": {
"field": "fieldCamelCase"
}
},
"script" : {
"inline": "ctx._source.fieldCamelCase = ctx._source.fieldCamelcase; ctx._source.remove(\"fieldCamelcase\");"
}
}
Run Code Online (Sandbox Code Playgroud)
使用 _update_by_query API 更新弹性版本 > 5(缺失已删除)中的字段名称:
示例: POST http://localhost:9200/INDEX_NAME/_update_by_query
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "NEW_FIELD_NAME"
}
}
}
},
"script" : {
"inline": "ctx._source.NEW_FIELD_NAME = ctx._source.OLD_FIELD_NAME; ctx._source.remove(\"OLD_FIELD_NAME\");"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8187 次 |
| 最近记录: |