Elasticsearch7.13重索引时字符串"0"/"1"转boolean类型方案咨询
方案1:重索引时通过Ingest Pipeline做类型转换(推荐)
该方案会将转换后的布尔值永久写入新索引,后续查询性能更高,符合重索引调整mapping的需求。
操作步骤
- 创建预处理管道
PUT _ingest/pipeline/convert_combinable_pipeline { "processors": [ { "script": { "source": """ // 遍历nested数组中的每个元素,转换COMBINABLE字段 if(ctx.options != null) { for(item in ctx.options) { item.COMBINABLE = item.COMBINABLE == "1"; } } """ } } ] }
注:如果原索引中的字段名是大写OPTIONS,请把脚本中的ctx.options对应修改为ctx.OPTIONS,Elasticsearch字段名大小写敏感。
- 创建目标索引,使用你提供的mapping配置
PUT 新索引名 { "mappings": { "OPTIONS": { "type": "nested", "properties": { "COMBINABLE": { "type": "boolean" } } } } }
- 执行重索引任务,指定使用上述预处理管道
POST _reindex { "source": { "index": "旧索引名" }, "dest": { "index": "新索引名", "pipeline": "convert_combinable_pipeline" } }
- (可选)提前验证管道逻辑
可以用simulate接口测试转换效果,无需修改真实数据:
POST _ingest/pipeline/convert_combinable_pipeline/_simulate { "docs": [ { "_source": { "options": [ {"COMBINABLE": "0"}, {"COMBINABLE": "1"} ] } } ] }
方案2:使用Runtime字段动态转换(无需重索引)
如果不需要修改原始存储数据,仅查询时需要按布尔类型使用该字段,可以用runtime字段实现查询时动态计算:
方式1:查询时临时指定runtime字段
POST 旧索引名/_search { "runtime_mappings": { "OPTIONS.COMBINABLE_BOOL": { "type": "boolean", "script": { "source": """ for(item in doc['OPTIONS.COMBINABLE']) { emit(item == '1'); } """ } } }, "query": { "nested": { "path": "OPTIONS", "query": { "term": { "OPTIONS.COMBINABLE_BOOL": true } } } } }
方式2:将runtime字段写入索引mapping永久生效
PUT 旧索引名/_mapping { "runtime": { "OPTIONS.COMBINABLE_BOOL": { "type": "boolean", "script": { "source": "for(item in doc['OPTIONS.COMBINABLE']) {emit(item == '1');}" } } } }
配置完成后可以直接在查询中使用OPTIONS.COMBINABLE_BOOL字段,用法和普通布尔字段完全一致。
内容的提问来源于stack exchange,提问作者S. Wasta
相关产品推荐
相关产品推荐

