如何查询Elasticsearch中是否仍存在旧格式的_id字段值?
解决Elasticsearch查询旧格式_id的问题
因为Elasticsearch的_id是元字段,默认不属于text或keyword类型,所以无法直接用query_string的通配符查询。你可以通过以下两种方法解决:
方法1:使用脚本查询直接匹配_id内容
通过脚本访问文档的_id值并判断是否包含目标字符串,示例查询:
GET /你的索引名/_search { "query": { "script": { "script": "doc['_id'].value.contains('WEDNESDAY')" } } }
如果需要批量匹配所有星期几,可扩展脚本逻辑:
GET /你的索引名/_search { "query": { "script": { "script": { "source": "def weekdays = ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY']; for (day in weekdays) { if (doc['_id'].value.contains(day)) { return true; } } return false;" } } } }
方法2:通过运行时字段转换_id类型
先创建一个运行时字段将_id转为keyword类型,再用wildcard查询:
GET /你的索引名/_search { "runtime_mappings": { "id_keyword": { "type": "keyword", "script": "emit(doc['_id'].value)" } }, "query": { "wildcard": { "id_keyword": "*WEDNESDAY*" } } }
注意事项
- 脚本查询会遍历所有文档,数据量大时性能较差,建议在测试环境或小数据量索引中使用。
- 如果需要长期执行这类查询,可考虑在索引映射中添加永久字段,写入时同步
_id的值(不过你已改为ES自动生成ID,该场景可能无需此操作)。
内容的提问来源于stack exchange,提问作者chimera_girl
相关产品推荐
相关产品推荐

