Skip to content
📖0 阅读·🤍0 点赞

ES中index参数故事版

index

index 属性指定一个字段是否被索引,该属性为 true 表示字段被索引,false 表示字段不被索引。

java
# index
DELETE users
PUT users
{
  "mappings": {
    "properties": {
      "age":{
        "type": "integer",
        "index": false
      }
    }
  }
}

PUT users/_doc/1
{
  "age":99
}

GET users/_search
{
  "query": {
    "term": {
      "age": 99
    }
  }
}

GET users/_doc/1

index参数:数字村的「商品扫码系统」🛒📱

想象数字村有个大型超市,每件商品都有条形码(索引)。超市经理发现有些商品根本不需要扫码,于是设计了灵活的扫码开关系统(index参数)


故事:超市的智能货架

1. 默认模式(index: true → 开启扫码)

json
"product_name": {
  "type": "text",   // 默认开启索引
  "index": true     // 可省略
}

货架管理员行为:

  • 📦 新商品上架 → 立即生成条形码
  • 🔍 顾客扫码查询 → 秒速找到商品位置
  • 📊 销售统计 → 快速生成报表

操作示例:

json
PUT supermarket/_doc/1
{
  "product_name": "有机苹果"
}

// 顾客扫码查询
GET supermarket/_search
{
  "query": {"match": {"product_name": "苹果"}}  // ✅ 立即找到
}

2. 节能模式(index: false → 关闭扫码)

json
"expiry_date": {
  "type": "date",
  "index": false   // 关闭索引
}

货架管理员行为:

  • 📦 商品照常入库 → 存入仓库
  • 🚫 不生成条形码 → 节省贴码时间
  • 🔒 无法扫码查询 → 只能手动查找

操作示例:

json
PUT supermarket/_doc/2
{
  "expiry_date": "2023-12-31"  // 入库但没条形码
}

// 尝试扫码查询(失败)
GET supermarket/_search
{
  "query": {"term": {"expiry_date": "2023-12-31"}}  // ❌ 找不到
}

// 但仓库记录存在!
GET supermarket/_doc/2
/* 返回:
  "expiry_date": "2023-12-31"  ✅ */

为什么需要关闭扫码?

三大实用场景

场景示例省力效果
敏感数据保护用户身份证号🛡️ 防止被搜索到
大内容优化商品详情HTML💾 节省存储空间
临时数据日志时间戳⚡ 提升写入速度

你的DSL案例解析

json
PUT users
{
  "mappings": {
    "properties": {
      "age":{
        "type": "integer",
        "index": false   // 关闭年龄扫码
      }
    }
  }
}
  • 🚫 顾客无法通过"年龄扫描仪"找人
  • 📦 但年龄数据仍存档案库

避坑指南

坑1:误关核心字段

json
// 错误配置
"product_id": {
  "type": "keyword",
  "index": false   // ❌ 商品ID无法搜索!
}

// 后果:顾客无法通过ID查商品

解决方案: 关键字段永远开启索引

坑2:与doc_values混淆

json
"price": {
  "type": "float",
  "index": false,   // 禁止搜索
  "doc_values": false // 禁止排序/聚合
}

双重关闭效果:

  • 🔒 无法搜索价格
  • 📉 无法按价格排序
  • 🧮 无法计算平均价格

智能开关策略

推荐配置方案

json
PUT smart_supermarket
{
  "mappings": {
    "properties": {
      // 必须扫码字段
      "barcode": {"type": "keyword"},  // 默认index:true
      
      // 无需扫码字段
      "product_html": {
        "type": "text",
        "index": false   // 大文本不索引
      },
      
      // 敏感字段
      "supplier_contact": {
        "type": "keyword",
        "index": false   // 保护联系方式
      },
      
      // 展示型字段
      "shelf_life_days": {
        "type": "integer",
        "index": false   // 保质期仅展示
      }
    }
  }
}

特殊场景:结合copy_to

json
"product_notes": {
  "type": "text",
  "index": false,   // 原始笔记不索引
  "copy_to": "search_field"  // 但复制到搜索字段
},
"search_field": {
  "type": "text"    // 集中索引
}
  • 📝 原始笔记不建索引 → 省空间
  • 🔍 但可通过search_field搜索

记忆口诀

商品扫码两模式:

  • 扫码开启(index:true)
    快速查找 即时统计 默认必备
  • 扫码关闭(index:false)
    保护隐私 节省资源 手动可见

三大禁用原则:

1️⃣ 敏感信息必关 → 防泄露
2️⃣ 大文本内容可关 → 省空间
3️⃣ 仅展示字段推荐关 → 提性能

特别注意:
⚠️ 关闭扫码 ≠ 商品消失 → 仓库里依然存在!
⚠️ 关键字段永远保持开启 → 否则超市会瘫痪

记住这个超市扫码系统的比喻,轻松掌握索引开关的精髓! 🎯🛒