真实对比显式Mapping和上一篇验证过的Dynamic Mapping,看字段类型的精确程度和写入时的类型校验强度有什么真实差异。
代码PUT /exp_map { "mappings": { "properties": { "zipcode": {"type": "keyword"}, "age": {"type": "integer"} } } } POST /exp_map/_doc/1 {"zipcode": "02139", "age": 30} POST /exp_map/_doc/2 {"zipcode": "02140", "age": "not-a-number"}
GET /exp_map/_mapping → zipcode → type: keyword ← 真实只有keyword这一种类型,没有text主字段 → age → type: integer ← 真实是比long更省空间的类型
对比本系列上一篇验证过的Dynamic Mapping默认行为(字符串字段真实会自动生成text主字段加keyword子字段两份),这次zipcode真实只有keyword一种类型——因为显式Mapping里只声明了keyword,ES不会自己"贴心"地再加一份text字段。age同理,动态推断给普通整数的默认类型真实是占8字节的long,这次显式声明成integer(4字节)真实生效了——这是显式Mapping真实的第一个价值:能精确控制每个字段该占多少存储、该不该同时支持全文检索和精确匹配,不需要接受动态推断给出的"过度安全"的默认选择。
POST /exp_map/_doc/2 {"zipcode": "02140", "age": "not-a-number"}
→ 400 document_parsing_exception:
"failed to parse field [age] of type [integer] in document with id '2'.
Preview of field's value: 'not-a-number'"
caused_by: number_format_exception: For input string: "not-a-number"每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
document_parsing_exception