我有一个字段,我想要不被分析,但它被分析(我的网址字段)。根据文档,我现在不能再删除映射,因为我现在是2.0。
是否有任何现有工具可以执行此操作并在我提供新旧映射时为我迁移数据,或者我是否必须自己编写代码?
现在存在的映射如下,如果还有其他陷阱,我甚至没有考虑:
{
"annotate": {
"mappings": {
"annotation": {
"properties": {
"Category": {
"type": "string",
"index": "not_analyzed"
},
"CreationUser": {
"type": "string",
"index": "not_analyzed"
},
"EndDate": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"Host": {
"type": "string",
"index": "not_analyzed"
},
"Id": {
"type": "string"
},
"Message": {
"type": "string"
},
"Owner": {
"type": "string",
"index": "not_analyzed"
},
"Source": {
"type": "string",
"index": "not_analyzed"
},
"StartDate": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"Url": {
"type": "string"
}
}
}
}
}
}
这种停机时间是可以接受的。该指数反正不大。
答案 0 :(得分:0)
npm工具elasticdump
和curl
可以非常直接的方式完成此任务。
以下是有点粗略的,因为它不是原子的,但它似乎运行良好:
新的映射文件刚刚从上面编辑了JSON,从包含“mapping”的对象开始。
#!/bin/bash
SRC=ny-lselastic01
DST=ny-lselastic01
SRC_INDEX=annotate
DST_INDEX=annotate_temp
#Create new mapping
echo curl -v "http://${SRC}:9200/${DST_INDEX}" --upload-file new_mapping.json
#Migrate Data
echo elasticdump \
--input=http://${SRC}:9200/${SRC_INDEX} \
--output=http://${DST}:9200/${DST_INDEX} \
--type=data
#delete Index
echo curl -X DELETE -v "http://${SRC}:9200/${SRC_INDEX}"
#create new mapping
echo curl -v "http://${SRC}:9200/${SRC_INDEX}" --upload-file new_mapping.json
#Move from temp new
echo elasticdump \
--input=http://${DST}:9200/${DST_INDEX} \
--output=http://${DST}:9200/${SRC_INDEX} \
--type=data
Elastic 2.3有_reindex
路由,这使得这更容易(在使用新映射创建新索引方面,步骤相同,但elasticdump
调用可以替换为{{_reindex
调用但是我还没有在生产中更新到2.3(但这与我当地的2.3 dev弹性工作有效)。
如果你使用别名,你可以在操作之前删除索引而只是切换别名。