ES_索引的操作


一、索引的生命周期操作 (CRUD与配置)

1. 创建索引 (Create)

创建索引是定义数据蓝图的第一步。最佳实践是始终在创建时显式指定 Mapping 和 Settings,而不是依赖动态映射。

基础命令:

bash 复制代码
PUT /my_first_index

这将创建一个使用所有默认配置(1个主分片,1个副本)的索引。

高级创建(架构师推荐方式):

bash 复制代码
# 创建一个用于文章搜索的索引,明确指定 settings 和 mappings
PUT /article_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "1s"
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word",  # 使用中文分词器
        "search_analyzer": "ik_smart"
      },
      "author": {
        "type": "keyword"  # 用于精确匹配和聚合
      },
      "publish_date": {
        "type": "date"
      },
      "content": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "word_count": {
        "type": "integer"
      }
    }
  }
}

返回值解读: { "acknowledged" : true, "shards_acknowledged" : true, "index" : "article_index" } 表示创建成功。

2. 查询索引信息 (Read)
  • 查看单个索引的详细信息(Mapping + Settings):

    bash 复制代码
    GET /article_index
  • 仅查看索引的 Mapping:

    bash 复制代码
    GET /article_index/_mapping
  • 仅查看索引的 Settings(包含默认值):

    bash 复制代码
    GET /article_index/_settings
  • 查看多个索引的信息:

    bash 复制代码
    GET /article_index,another_index/_settings
  • 查看所有索引(常用于健康检查):

    bash 复制代码
    # 查看所有索引的状态、分片、文档数等概览信息
    GET _cat/indices?v

    输出示例:

    复制代码
    health status index        uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   article_index 7y4XjW0rQa6X4EiD7  3   1          0            0       1.1kb           1.1kb
3. 修改索引配置 (Update)

注意: 并非所有配置都可修改。number_of_shards 和大多数静态设置一经创建就无法更改。但一些动态设置可以实时修改,最常用的是调整副本数。

  • 动态修改副本数: 在流量高峰时增加副本以提高读取吞吐量,在夜间减少副本以节省资源。

    bash 复制代码
    PUT /article_index/_settings
    {
      "number_of_replicas": 2
    }
  • 动态修改刷新间隔: 在进行大规模批量导入时,临时增大刷新间隔以提升写入性能。

    bash 复制代码
    # 导入开始前,暂停刷新
    PUT /article_index/_settings
    {
      "refresh_interval": -1
    }
    
    # ... 执行批量导入操作 (e.g., using _bulk API) ...
    
    # 导入完成后,恢复刷新
    PUT /article_index/_settings
    {
      "refresh_interval": "1s"
    }
4. 删除索引 (Delete)

删除操作是不可逆的 ,会立即释放磁盘空间。执行此命令务必谨慎!

bash 复制代码
DELETE /article_index

返回值: { "acknowledged" : true }

保护机制: 为了防止误删,可以通过设置 action.destructive_requires_name: true(在 elasticsearch.yml 中)来禁止使用通配符(如 DELETE *)或 _all 删除索引。


二、索引数据的操作 (文档CRUD)

索引的最终目的是存储和检索数据(文档)。

1. 写入/更新文档
  • 指定文档ID写入 (Index API):

    bash 复制代码
    PUT /article_index/_doc/1  # 指定文档ID为1
    {
      "title": "Elasticsearch 入门教程",
      "author": "张三",
      "publish_date": "2024-05-20",
      "content": "这是一篇关于ES的详细教程...",
      "word_count": 1000
    }
  • 不指定文档ID写入 (Create API): ES 会自动生成一个唯一 ID。

    bash 复制代码
    POST /article_index/_doc/
    {
      "title": "另一个文章",
      ... 
    }
2. 查询文档
  • 根据ID查询文档:

    bash 复制代码
    GET /article_index/_doc/1
  • 复杂搜索 (Search API): 这是 ES 的核心功能。

    bash 复制代码
    GET /article_index/_search
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "title": "教程" } }
          ],
          "filter": [
            { "range": { "word_count": { "gte": 500 } } }
          ]
        }
      },
      "sort": [
        { "publish_date": { "order": "desc" } }
      ],
      "from": 0,
      "size": 10
    }
3. 删除文档
  • 根据ID删除:

    bash 复制代码
    DELETE /article_index/_doc/1
  • 根据查询条件删除 (Delete By Query API): 慎用! 它会删除所有匹配查询的文档。

    bash 复制代码
    POST /article_index/_delete_by_query
    {
      "query": {
        "range": {
          "publish_date": {
            "lt": "2020-01-01"
          }
        }
      }
    }

三、高级运维与管理操作

1. 打开/关闭索引
  • 关闭索引: 索引被关闭后,不再占用除磁盘空间外的任何资源(CPU、内存句柄),无法进行任何读写操作。常用于归档历史数据。

    bash 复制代码
    POST /article_index/_close
  • 打开索引:

    bash 复制代码
    POST /article_index/_open
2. 索引别名 (Alias) 操作

别名是生产环境的必备特性,它提供了极大的灵活性。

  • 创建别名:

    bash 复制代码
    POST /_aliases
    {
      "actions": [
        {
          "add": {
            "index": "article_index_2024_05",
            "alias": "current_articles"
          }
        }
      ]
    }
  • 原子化操作:无缝切换别名指向(零停机维护)

    这是别名最强大的功能。假设我们有一个新索引 article_index_2024_06 要上线,想将 current_articles 别名从旧索引指向新索引。

    bash 复制代码
    POST /_aliases
    {
      "actions": [
        {
          "remove": {  # 先移除旧索引
            "index": "article_index_2024_05", 
            "alias": "current_articles"
          }
        },
        {
          "add": {     # 再添加新索引(这是一个原子操作)
            "index": "article_index_2024_06", 
            "alias": "current_articles"
          }
        }
      ]
    }

    你的应用程序始终访问 current_articles,对后端的索引切换无感知。

3. 索引模板 (Index Template)

用于自动为匹配特定模式的新索引应用预定义的 Settings 和 Mappings。对于时序数据(如日志)至关重要。

bash 复制代码
PUT _index_template/my_logs_template
{
  "index_patterns": ["logs-*"],  # 匹配所有以 `logs-` 开头的索引
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "refresh_interval": "30s"
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "level": { "type": "keyword" },
        "message": { "type": "text" }
      }
    }
  },
  "priority": 1
}

之后,当你创建 logs-app-2024.05.20 时,它会自动拥有模板中定义的配置。

4. 监控与维护
  • 查看索引分片分配和状态:

    bash 复制代码
    GET _cat/indices/article_index?v&s=pri.store.size:desc&h=index,pri,rep,pri.store.size,status
  • 强制段合并 (Force Merge): 将 Lucene 分段合并为更少、更大的段,可以显著提升查询速度并减少磁盘空间 。但这是一个 I/O 密集型操作,应在业务低峰期对只读索引(如历史归档索引)执行。

    bash 复制代码
    POST /article_index/_forcemerge?max_num_segments=1
  • 清理缓存:

    bash 复制代码
    POST /article_index/_cache/clear
  • 刷新 (Refresh) 与 冲洗 (Flush):

    bash 复制代码
    # 手动刷新,使当前已写入但未刷新的数据立即可搜
    POST /article_index/_refresh
    
    # 手动执行flush,将内存中的translog数据持久化到磁盘
    POST /article_index/_flush

总结:架构师的操作视角

对索引的操作远不止简单的增删改查。一个资深架构师的视角是:

  1. 设计先行 :在 PUT index 之前,就用纸笔或设计文档规划好 Mapping 和 Settings。
  2. 别名无处不在:所有应用程序都通过别名访问索引,为未来的数据迁移、索引重建和滚动升级留下余地。
  3. 自动化生命周期 :对日志、监控等时序数据,使用索引模板 (Index Template) + 滚动创建 (Rollover) + ILM 策略 实现全自动化管理。
  4. 运维可观测 :熟练使用 _cat API 和监控工具(如 Kibana)来观察索引的健康度、性能和资源使用情况。
  5. 谨慎执行写操作DELETEforce_mergeclose 等操作具有破坏性或高开销,需有严格的审批或自动化流程。
相关推荐
青鱼入云7 分钟前
【面试场景题】电商订单系统分库分表方案设计
大数据·面试·职场和发展
在未来等你1 小时前
Kafka面试精讲 Day 12:副本同步与数据一致性
大数据·分布式·面试·kafka·消息队列
Jayyih1 小时前
嵌入式系统学习Day35(sqlite3数据库)
数据库·学习·sqlite
云边云科技1 小时前
门店网络重构:告别“打补丁”,用“云网融合”重塑数字竞争力!
大数据·人工智能·安全·智能路由器·零售
渣渣盟2 小时前
Spark核心:单跳转换率计算全解析
大数据·spark·scala·apache
edisao3 小时前
[特殊字符] 从助手到引擎:基于 GPT 的战略协作系统演示
大数据·人工智能·gpt
IT毕设梦工厂3 小时前
大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·信息可视化·spark·毕业设计·数据可视化·bigdata
得意霄尽欢3 小时前
Redis之底层数据结构
数据结构·数据库·redis
hsjkdhs4 小时前
MySQL 数据类型与运算符详解
数据库·mysql
华略创新4 小时前
利用数据分析提升管理决策水平
大数据·数据分析·crm·管理系统·软件