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

ES中index_options参数故事版

index_options

index_options 控制索引时哪些信息被存储到倒排索引中(用在 text 字段中),有四种取值

index_options备注
docs只存储文档编号,默认即此
freqs在 docs 基础上,存储词项频率
positions在 freqs 基础上,存储词项偏移位置
offsets在 positions 基础上,存储词项开始和结束的字符位置

index_options:数字村的「图书管理员笔记术」📚✍️

想象数字村的图书馆里有个超级管理员,他负责记录每本书的关键词位置。index_options就是他的笔记精细度等级,决定了记录关键词时要写多详细:


故事:管理员的四种笔记术

1. 基础笔记术(docs)→ 只记书名

json
"title": {
  "type": "text",
  "index_options": "docs"   // 最简记录
}

管理员行为:

  • 📖 看到《哈利波特》出现"魔法"一词
  • 📒 只记书名魔法 → [哈利波特]
  • 不记次数和位置

搜索效果:

json
// 能知道哪些书包含"魔法"
GET library/_search
{
  "query": {"term": {"title": "魔法"}}  // ✅ 返回《哈利波特》
}
// ❌ 但不知道出现几次、在什么位置

2. 计数笔记术(freqs)→ 书名+次数

json
"title": {
  "type": "text",
  "index_options": "freqs"   // 增加计数
}

管理员行为:

  • 📖 发现《哈利波特》出现5次"魔法"
  • 📒 记录魔法 → [哈利波特](出现5次)

搜索效果:

json
// 知道"魔法"在《哈利波特》中出现5次
// 可用于相关性排序(出现越多越靠前)

3. 定位笔记术(positions)→ 书名+次数+页码

json
"content": {
  "type": "text",
  "index_options": "positions"  // 增加位置
}

管理员行为:

  • 📖 发现"魔法"出现在:
    • P10第3行、P45第8行、P120第5行
  • 📒 记录魔法 → [哈利波特](位置:10.3, 45.8, 120.5)

搜索效果:

json
// 支持短语搜索(要求词按顺序出现)
GET library/_search
{
  "query": {
    "match_phrase": {
      "content": "魔法世界"  // ✅ 要求"魔法"后紧跟"世界"
    }
  }
}

4. 精确定位术(offsets)→ 书名+次数+页码+行号

json
"content": {
  "type": "text",
  "index_options": "offsets"  // 增加字符偏移
}

管理员行为:

  • 📖 发现"魔法"出现在:
    • P10第3行:第15-17字符
    • P45第8行:第22-24字符
  • 📒 记录魔法 → [哈利波特](位置:10.3:15-17, 45.8:22-24)

搜索效果:

json
// 支持高亮显示(精确到字符位置)
GET library/_search
{
  "query": {"match": {"content": "魔法"}},
  "highlight": {
    "fields": {"content": {}}
  }
}
/* 返回:
  "highlight": {
    "content": ["...<em>魔法</em>世界..."]
  } */

四阶笔记术对比表

等级记录内容比喻存储开销应用场景
docs只存书名书单目录⚡ 最小简单匹配
freqs书名+次数借阅统计表⚡⚡ 中低相关性排序
positions+词位置目录+页码⚡⚡⚡ 中高短语搜索
offsets+字符位行号标注⚡⚡⚡⚡ 最大高亮显示

管理员的工作建议

场景1:商品标题搜索

json
"product_name": {
  "type": "text",
  "index_options": "freqs"   // 知道出现次数即可
}
  • ✅ 适合:按关键词频率排序
  • ❌ 无需:短语搜索或高亮

场景2:法律条文检索

json
"law_text": {
  "type": "text",
  "index_options": "offsets"  // 需精确高亮
}
  • ✅ 必要:显示"宪法第五条"的高亮
  • 💾 代价:存储开销增加30%~50%

场景3:日志关键字监控

json
"error_log": {
  "type": "text",
  "index_options": "docs"    // 只需知道是否出现
}
  • ✅ 高效:快速检测"ERROR"是否出现
  • 💾 节省:比offsets减少60%存储

避坑指南

坑1:滥用offsets

json
// 错误配置(百GB数据用offsets)
"big_content": {
  "type": "text",
  "index_options": "offsets"   // ❌ 存储爆炸!
}

后果: 索引大小翻倍,写入速度减半

坑2:需要phrase却用docs

json
// 错误配置
"description": {
  "type": "text",
  "index_options": "docs"   // ❌ 无法短语搜索
}

// 用户搜索失败
GET products/_search
{
  "query": {
    "match_phrase": {
      "description": "无线充电"  // ❌ 无位置信息
    }
  }
}

黄金配置法则

json
PUT optimal_index
{
  "mappings": {
    "properties": {
      // 标题类短文本
      "title": {
        "type": "text",
        "index_options": "freqs"  // 平衡性能与功能
      },
      
      // 内容类长文本
      "body": {
        "type": "text",
        "index_options": "positions" // 支持短语搜索
      },
      
      // 需高亮字段
      "quote": {
        "type": "text",
        "index_options": "offsets"   // 精确高亮
      },
      
      // 标签类字段
      "tags": {
        "type": "text",
        "index_options": "docs"      // 只需匹配存在性
      }
    }
  }
}

记忆口诀

图书管理员四阶笔记术:

  1. docs → 只记书名
    知道有,不知在哪
  2. freqs → 书名+次数
    知热度,排序用
  3. positions → 书名+次数+页码
    找短语,必须用
  4. offsets → 书名+次数+页码+行号
    精定位,高亮用

选择原则:

📌 功能够用就好 → 避免过度存储
📌 高亮必须offsets → 其他场景慎用
📌 短语搜索要positions → docs/freqs不支持

记住这个图书管理员的比喻,轻松掌握搜索优化的精髓! 🎯🔍