Elasticsearch 2.4 Java配置日期映射报错求助
解决Elasticsearch 2.4中日期动态映射的配置问题
首先,咱们来分析你遇到的异常——MapperParsingException是因为你的映射结构写错了:你在类型映射内部多余嵌套了一层mappings节点,而Elasticsearch 2.4的类型映射结构根本不支持这种嵌套方式,所以才会报错说“不支持[mappings]参数”。
接下来针对你的需求(禁用日期动态映射+为日期字段指定特定格式),我给你修正后的代码:
修正后的Java代码
CreateIndexResponse indexRequestBuilder = transportClient.admin().indices() .prepareCreate(index_name) .setSettings(settings) .addMapping(index_name, createMappingBuilder(index_name)) .execute() .actionGet(); private static XContentBuilder createMappingBuilder(String typeName) throws IOException { XContentBuilder builder = jsonBuilder() .startObject() // 针对当前类型的映射配置 .startObject(typeName) // 禁用自动日期检测:这样ES不会把字符串自动识别为日期类型(实现禁用日期动态映射) .field("date_detection", false) // 手动定义日期字段及其格式 .startObject("properties") // 这里替换成你实际的日期字段名,比如"register_date" .startObject("birth_date") .field("type", "date") // 指定日期格式为dd/MM/yyyy .field("format", "dd/MM/yyyy") .endObject() // 可以继续添加其他字段的映射配置 .endObject() .endObject() .endObject(); return builder; }
关键细节说明
- 移除多余的
mappings嵌套:你之前的代码里错误地在typeName节点下又加了一层mappings,这完全是冗余的,因为addMapping方法本身就是用来添加当前索引下指定类型的映射,直接配置类型节点内的参数即可。 - 禁用动态日期映射:通过设置
date_detection: false,Elasticsearch就不会再自动将字符串类型的字段识别为日期类型,彻底禁用日期的动态映射。 - 手动指定日期字段格式:如果有需要映射为日期类型的字段,必须手动在
properties节点下定义,同时通过format参数指定你需要的dd/MM/yyyy格式。
可选调整:如果只想修改动态日期识别格式而非完全禁用
如果你不想完全禁用日期动态映射,只是希望ES只按照dd/MM/yyyy格式来识别日期,那可以去掉date_detection: false,换成dynamic_date_formats配置:
private static XContentBuilder createMappingBuilder(String typeName) throws IOException { XContentBuilder builder = jsonBuilder() .startObject() .startObject(typeName) // 设置动态日期识别的格式为dd/MM/yyyy .field("dynamic_date_formats", Collections.singletonList("dd/MM/yyyy")) // 依然可以手动定义特定日期字段 .startObject("properties") .startObject("birth_date") .field("type", "date") .field("format", "dd/MM/yyyy") .endObject() .endObject() .endObject() .endObject(); return builder; }
内容的提问来源于stack exchange,提问作者Abinash
相关产品推荐
相关产品推荐

