当前位置: 首页 > news >正文

ES_索引的操作


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

1. 创建索引 (Create)

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

基础命令:

PUT /my_first_index

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

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

# 创建一个用于文章搜索的索引,明确指定 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):

    GET /article_index
    
  • 仅查看索引的 Mapping:

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

    GET /article_index/_settings
    
  • 查看多个索引的信息:

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

    # 查看所有索引的状态、分片、文档数等概览信息
    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 和大多数静态设置一经创建就无法更改。但一些动态设置可以实时修改,最常用的是调整副本数。

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

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

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

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

DELETE /article_index

返回值: { "acknowledged" : true }

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


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

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

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

    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。

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

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

    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删除:

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

    POST /article_index/_delete_by_query
    {"query": {"range": {"publish_date": {"lt": "2020-01-01"}}}
    }
    

三、高级运维与管理操作

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

    POST /article_index/_close
    
  • 打开索引:

    POST /article_index/_open
    
2. 索引别名 (Alias) 操作

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

  • 创建别名:

    POST /_aliases
    {"actions": [{"add": {"index": "article_index_2024_05","alias": "current_articles"}}]
    }
    
  • 原子化操作:无缝切换别名指向(零停机维护)
    这是别名最强大的功能。假设我们有一个新索引 article_index_2024_06 要上线,想将 current_articles 别名从旧索引指向新索引。

    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。对于时序数据(如日志)至关重要。

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. 监控与维护
  • 查看索引分片分配和状态:

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

    POST /article_index/_forcemerge?max_num_segments=1
    
  • 清理缓存:

    POST /article_index/_cache/clear
    
  • 刷新 (Refresh) 与 冲洗 (Flush):

    # 手动刷新,使当前已写入但未刷新的数据立即可搜
    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 等操作具有破坏性或高开销,需有严格的审批或自动化流程。
http://www.dtcms.com/a/343139.html

相关文章:

  • 基础网络模型
  • 【矩池云】实现Pycharm远程连接,上传数据并解压缩
  • 为什么程序部署到线上,就无法读取环境变量了
  • B2B工业品制造业TOB大客户营销培训老师培训师唐兴通谈AI数字化销售AI销冠底层逻辑数字化转型创新增长业绩
  • MyBatis-Plus MetaObjectHandler的几个坑(主要是id字段)
  • 《AI智脉速递》2025 年 8 月15 日 - 21 日
  • JetBrains 内的 GitHub Copilot Agent Mode + MCP:从配置到实战
  • vmware安装centos7
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第二章知识点问答(21题)
  • A股大盘数据-20250821 分析
  • 领域驱动中IUnitOfWork是干什么的
  • 【StarRocks】-- SQL CTE 语法
  • 机器学习中的集成算法与 k 均值聚类算法概述
  • 机器学习5
  • 解决办法:Chrome插件不能用,这些扩展程序不再受支持,因此已停用
  • 动态寻北仪如何在矿用掘进机中进行应用?
  • 用Vue2和Echarts画图的基本流程
  • AI升级社区便民服务:AI办事小程序高效办证+应急系统秒响应,告别跑腿愁住得更安心
  • K8s快速上手-微服务篇
  • AI资深 Java 研发专家系统解析Java 中常见的 Queue实现类
  • 【尝试】在macOS上安装cvat
  • unity实现点击rawimage,确定对应的世界坐标点
  • 记录前端菜鸟的日常——小程序内嵌H5页面自定义分享按钮
  • 环形子数组的最大和
  • Ubuntu24.04 交叉编译libuv库(已编译好的) 之undefined reference to `pthread_getname_np‘解决
  • VMware Workstation里的Ubuntu22.04找不到共享文件夹
  • Ubuntu Server 安装 gvm 管理 Go 语言开发环境
  • 代码随想录Day58:图论(拓扑排序精讲、最短路算法dijkstra朴素版精讲)
  • Android焦点窗口变化导致遥控键值监听失效问题分析
  • AI编程避坑指南:常见错误与解决策略