ES基本数据类型解析,新手避坑指南,ES(Elasticsearch)数据类型详解与新手防坑攻略
刚学ES的新手十有八九踩过这个坑:明明存了“苹果手机”,搜索“苹果”却啥也找不到🤯!别慌,今天用人话拆解ES里最让人懵的text和keyword区别,附赠3条救命技巧👇
💡 一、text和keyword到底差在哪?
text就像绞肉机🔪:
存入“2025新款iPhone” → 自动切成【2025】【新款】【iPhone】
能搜零碎词:搜“新款”也能命中
代价:无法精确匹配整句话(比如搜“2025新款”反而漏了)
keyword像保险箱🔒:
存“2025新款iPhone” → 原封不动锁进仓库
必须整句匹配:搜“2025新款”=0结果,必须搜完整句子
适用场景:品牌名、订单号、身份证(不能切分的值)
❗ 致命误区:
“我把商品标题设成keyword总行了吧?”
→ 结果用户搜“便宜手机”时,你的“高性价比手机”完全搜不出!
✅ 正解:标题用text,商品编码用keyword!
🚫 二、动态映射的连环坑
ES有个“好心办坏事”的功能:自动猜字段类型。比如:
第一次存
{"age": "18"}
→ ES当成字符串第二次存
{"age": 18}
→ 直接报类型冲突!
🔥 避坑三件套:
1️⃣ 手动定义mapping:
json复制PUT /product{"mappings": {"properties": {"title": { "type": "text" }, // 可分词搜"sn": { "type": "keyword" } // 精确匹配}}}
2️⃣ 关动态映射:"dynamic": false
3️⃣ 误存补救:用reindex
重建索引
⏰ 三、日期格式化血泪史
你肯定遇到过:存个时间2025-07-28 12:30:00
,ES居然不认❌!
👉 真相:ES默认只认两种格式:
2025-07-28T12:30:00
(带T的国际格式)时间戳(毫秒数)
💥 自救方案:
json复制"create_time": {"type": "date","format": "yyyy-MM-dd HH:mm:ss" // 加自定义格式}
⚠️ 注意:格式化必须存数据前设置!事后改mapping等于重搭房子🏗️
🔢 四、数值类型的隐藏雷区
ES的数值类型(integer、float)看着简单?坑在这里:
存
3.0
到integer字段 → 自动取整成3范围查询
18<=age<=20
时,18.5直接被忽略
✅ 黄金法则:
金额、坐标 → 用scaled_float(如
"scaling_factor": 100
避免小数)年龄、库存 → 用integer_range(
{"gte":18, "lte":60}
)
🧠 独家避坑脑图
来自被ES虐了3年的老工程师:
🔸 该用text的:用户输入、评论、文章
🔸 *** 用keyword的:ID、状态码、枚举值
🔸 别碰动态映射:生产环境手动定义mapping!
🔸 日期字段:创建索引立刻锁 *** format
🔸 数值比较:范围查询优先用range类型
为什么说ES像傲娇猫主子?你按它的规则撸顺毛,它才给你高性能回报🐱💨