Elasticsearch 7.1如何将非索引text字段cityName设为可索引?
Elasticsearch 7.1 修改cityName字段为可索引的方案
核心结论
你无法直接修改现有字段的index属性——Elasticsearch的字段映射一旦创建,index这类核心属性不允许直接修改,必须通过重新索引来实现。不过可以用零停机的方式完成操作,步骤如下:
操作步骤
创建带正确映射的新索引
新建一个索引(比如命名为原索引名_new),在映射中将cityName的index设为true,其他字段保持和原索引一致:PUT /原索引名_new { "mappings": { "properties": { // 复制原索引的其他所有字段配置 "cityName": { "type": "text", "index": true } } } }将原索引数据同步到新索引
使用_reindexAPI完成数据迁移:POST _reindex { "source": { "index": "原索引名" }, "dest": { "index": "原索引名_new" } }可以添加
wait_for_completion=false参数后台执行,避免请求超时。切换索引指向(零停机)
- 如果你原本用别名对外提供服务,执行别名切换:
POST _aliases { "actions": [ { "remove": { "index": "原索引名", "alias": "业务用别名" } }, { "add": { "index": "原索引名_new", "alias": "业务用别名" } } ] } - 没用别名的话,直接修改应用代码中的索引名称为新索引,验证正常后即可删除旧索引。
- 如果你原本用别名对外提供服务,执行别名切换:
临时替代方案(不推荐长期使用)
如果只是临时需要查询cityName,可以用**运行时字段(runtime field)**在查询时动态生成可索引的字段,但这种方式是查询时计算,性能远不如提前索引的字段,仅适合临时场景:
PUT /原索引名/_mapping { "runtime": { "cityName_indexed": { "type": "text", "script": { "source": "emit(doc['cityName'].value)" } } } }
之后可以通过cityName_indexed字段进行查询,但长期使用还是建议走重新索引的方式。
内容的提问来源于stack exchange,提问作者user24614737
相关产品推荐
相关产品推荐

