Elasticsearch 7 插入文档后索引动态映射未展示字段数据类型问题
问题根因说明
你当前看不到正常的字段映射,根本原因是代码传参错误,并非ES动态映射功能失效:从你返回的demo索引mapping可以看到,properties的key是一整个转义后的JSON字符串,说明你调用ES写入接口时,把POJO序列化得到的JSON字符串做了二次封装/二次序列化,导致ES将你传入的整个字符串识别为单个字段的字段名,仅生成了这个异常字段的text+keyword映射,根本没有触发多字段的动态映射规则。
动态映射字段类型的查询方式
正常启用动态映射的索引,自动识别的字段类型直接通过两个接口即可查询:
- 调用
GET /{索引名}接口,返回结果的mappings.properties下每个键对应的type就是自动分配的字段类型 - 也可以调用更精准的
GET /{索引名}/_mapping接口,只返回映射相关内容,没有索引settings等冗余信息
问题修复方案
检查你服务层Java High Level Rest Client的IndexRequest构造逻辑,不要对已经序列化好的JSON串做二次序列化,正确的写入代码示例如下:
public CreateAndUpdateResponse createDocumentById(String indexName, String jsonData) { IndexRequest indexRequest = new IndexRequest(indexName); // 直接传入已序列化的JSON字符串,明确指定内容类型为JSON indexRequest.source(jsonData, XContentType.JSON); IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); // 其余业务逻辑 }
修复后重新写入文档,再调用映射查询接口,就能看到index_name、status、created_at_epoch等字段分别被自动识别为对应类型,比如数值类字段识别为long、字符串类默认生成text+keyword双类型、符合格式的日期字段识别为date类型。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

