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 等操作具有破坏性或高开销,需有严格的审批或自动化流程。
相关推荐
xiucai_cs20 分钟前
MySQL深分页慢问题及性能优化
数据库·mysql·性能优化·深分页
当牛作馬21 分钟前
ES常用查询命令
数据库·mysql·elasticsearch
蝎子莱莱爱打怪24 分钟前
Hadoop3.3.5、Hbase2.6.1 集群搭建&Phoenix使用记录
大数据·后端·hbase
程序员不迷路3 小时前
Flink学习
大数据·flink
共享家95274 小时前
MYSQL库及表的操作
数据库
Raisy_5 小时前
05 ODS层(Operation Data Store)
大数据·数据仓库·kafka·flume
想回家的一天5 小时前
Go1.25的源码分析-src/runtime/runtime1.go(GMP)
数据库·redis·缓存
郭二哈6 小时前
git的使用
大数据·网络·git·elasticsearch
阿里云大数据AI技术6 小时前
鹰角网络基于阿里云EMR Serverless StarRocks的实时分析工程实践
数据库·数据分析