ES基本数据类型解析,新手避坑指南,ES(Elasticsearch)数据类型详解与新手防坑攻略

刚学ES的新手十有八九踩过这个坑:明明存了“苹果手机”,搜索“苹果”却啥也找不到🤯!别慌,今天用人话拆解ES里最让人懵的​​text和keyword区别​​,附赠3条救命技巧👇


💡 一、text和keyword到底差在哪?

​text​​就像绞肉机🔪:

  • 存入“2025新款iPhone” → 自动切成【2025】【新款】【iPhone】

  • ES基本数据类型解析,新手避坑指南,ES(Elasticsearch)数据类型详解与新手防坑攻略  第1张

    ​能搜零碎词​​:搜“新款”也能命中

  • ​代价​​:无法精确匹配整句话(比如搜“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像傲娇猫主子?你按它的规则撸顺毛,它才给你高性能回报🐱💨