【Elasticsearch】Elasticsearch 核心技术(一):索引

article/2025/7/5 7:53:16

Elasticsearch 核心技术(一):索引

  • 1.索引的定义
  • 2.索引的命名规范
  • 3.索引的增、删、改、查
    • 3.1 创建索引
      • 3.1.1 创建空索引
    • 3.2 删除索引
    • 3.3 文档操作
      • 3.3.1 添加/更新文档(指定ID)
      • 3.3.2 添加文档(自动生成ID)
      • 3.3.3 更新文档(部分更新)
      • 3.3.4 删除文档
    • 3.4 查询操作
      • 3.4.1 获取单个文档
      • 3.4.2 搜索文档(简单查询)
      • 3.4.3 复合查询
      • 3.4.4 聚合查询
    • 3.5 批量操作
      • 3.5.1 批量索引文档
      • 3.5.2 批量更新/删除
  • 4.索引别名
    • 4.1 什么是索引别名?
    • 4.2 索引别名的作用
    • 4.3 具体实现方法
      • 4.3.1 创建别名
      • 4.3.2 为多个索引创建别名
      • 4.3.3 切换别名(原子操作)
      • 4.3.4 带过滤条件的别名
      • 4.3.5 查看别名信息
    • 4.4 使用示例场景
      • 场景1:索引重建与零停机切换
      • 场景2:分片查询
    • 4.5 注意事项
    • 4.6 实际应用案例
      • 电商平台商品索引管理
  • 5.索引模板
    • 5.1 什么是索引模板?
    • 5.2 索引模板主要解决的业务问题
    • 5.3 索引模板类型
    • 5.4 具体实现方法
      • 5.4.1 创建简单索引模板
      • 5.4.2 使用组件模板(更模块化)
    • 5.5 实际应用案例
      • 案例 1:电商平台订单索引
      • 案例 2:多租户 SaaS 应用
    • 5.6 使用时注意事项
    • 5.7 最佳实践建议

1.索引的定义

索引是具有相同数据结构的文档的集合,由唯一索引名称标定。一个集群中有多个索引,不同的索引代表不同的业务类型数据。比如:

  • 将采集的不同业务类型的数据存储到不同的索引
    • 微博业务:weibo_index
    • 新闻业务:news_index
  • 按日期切分存储日志索引
    • 2024 年 7 月的日志对应 logs_202407
    • 2024 年 8 月的日志对应 logs_202408

例如,通过以下命令创建名为 index_00001 的索引。

PUT index_00001

2.索引的命名规范

✅ 索引的命名规范如下:

  • 只能使用小写字母,不能使用大写字母
  • 不能包括 \ / * ? " < > | '' , # : 及空格等特殊符号
  • 不能以 - _ + 作为开始字符
  • 不能命名为 . 或者 ..
  • 不能超过 255 255 255 个字节
  • 不建议使用中文命名

❌ 错误的命名方式

  • 不允许:PUT INDEX_0002
  • 不允许:PUT _index_0003
  • 不允许:PUT index?_0004
  • 不允许:PUT ..
  • 不规范:PUT 索引0006

3.索引的增、删、改、查

以下示例展示了 Elasticsearch 中最常用的索引和文档操作。实际使用时,可以根据具体需求调整查询条件和参数。

3.1 创建索引

3.1.1 创建空索引

PUT /my_index
{"settings": {"number_of_shards": 3,"number_of_replicas": 2},"mappings": {"properties": {"title": {"type": "text"},"description": {"type": "text"},"price": {"type": "float"},"created_at": {"type": "date"}}}
}

在这里插入图片描述

3.2 删除索引

DELETE /my_index

3.3 文档操作

3.3.1 添加/更新文档(指定ID)

PUT /my_index/_doc/1
{"title": "Elasticsearch Guide","description": "A comprehensive guide to Elasticsearch","price": 49.99,"created_at": "2023-01-15"
}

在这里插入图片描述

3.3.2 添加文档(自动生成ID)

POST /my_index/_doc
{"title": "Learning Elasticsearch","description": "Beginner's guide to Elasticsearch","price": 29.99,"created_at": "2023-02-20"
}

在这里插入图片描述

3.3.3 更新文档(部分更新)

POST /my_index/_update/1
{"doc": {"price": 39.99}
}

在这里插入图片描述

3.3.4 删除文档

DELETE /my_index/_doc/1

3.4 查询操作

3.4.1 获取单个文档

GET /my_index/_doc/1

在这里插入图片描述

3.4.2 搜索文档(简单查询)

GET /my_index/_search
{"query": {"match": {"title": "guide"}}
}

在这里插入图片描述

3.4.3 复合查询

GET /my_index/_search
{"query": {"bool": {"must": [{ "match": { "title": "guide" } }],"filter": [{ "range": { "price": { "lte": 50 } } }]}},"sort": [{ "created_at": { "order": "desc" } }],"from": 0,"size": 10
}

在这里插入图片描述

3.4.4 聚合查询

GET /my_index/_search
{"size": 0,"aggs": {"avg_price": {"avg": { "field": "price" }},"price_ranges": {"range": {"field": "price","ranges": [{ "to": 20 },{ "from": 20, "to": 50 },{ "from": 50 }]}}}
}

在这里插入图片描述

3.5 批量操作

3.5.1 批量索引文档

POST /my_index/_bulk
{ "index": { "_id": "2" } }
{ "title": "Advanced Elasticsearch", "description": "For experienced users", "price": 59.99, "created_at": "2023-03-10" }
{ "index": { "_id": "3" } }
{ "title": "Elasticsearch Cookbook", "description": "Practical recipes", "price": 45.50, "created_at": "2023-04-05" }

在这里插入图片描述

3.5.2 批量更新/删除

POST /my_index/_bulk
{ "update": { "_id": "2" } }
{ "doc": { "price": 55.99 } }
{ "delete": { "_id": "3" } }

在这里插入图片描述

4.索引别名

4.1 什么是索引别名?

索引别名Index Alias)是 Elasticsearch 中一个指向一个或多个索引的虚拟名称。它就像是一个指针或快捷方式,允许你通过一个名称来引用实际的索引,而不需要直接使用索引的真实名称。

4.2 索引别名的作用

  • 简化索引管理:为复杂的索引名称提供简单的别名。
  • 无缝切换索引:在不更改应用代码的情况下切换底层索引。
  • 实现零停机维护:重建索引时不影响查询。
  • 分组查询:通过一个别名查询多个索引。
  • 权限控制:为不同用户提供不同的别名访问同一索引。
  • 实现索引生命周期策略:如热温冷架构。

4.3 具体实现方法

4.3.1 创建别名

# 为单个索引创建别名
POST /_aliases
{"actions": [{"add": {"index": "products_2023","alias": "current_products"}}]
}

4.3.2 为多个索引创建别名

POST /_aliases
{"actions": [{"add": {"index": "products_2023_q1","alias": "all_products"}},{"add": {"index": "products_2023_q2","alias": "all_products"}}]
}

4.3.3 切换别名(原子操作)

POST /_aliases
{"actions": [{"remove": {"index": "products_2023","alias": "current_products"}},{"add": {"index": "products_2024","alias": "current_products"}}]
}

4.3.4 带过滤条件的别名

POST /_aliases
{"actions": [{"add": {"index": "products","alias": "high_value_products","filter": {"range": {"price": {"gte": 1000}}}}}]
}

4.3.5 查看别名信息

GET /_alias/current_products
GET /products_2023/_alias

4.4 使用示例场景

场景1:索引重建与零停机切换

  • 创建新索引并导入数据
PUT /products_2024_v2
{"settings": { /* 新设置 */ },"mappings": { /* 新映射 */ }
}# 导入数据到新索引...
  • 原子切换别名
POST /_aliases
{"actions": [{"remove": {"index": "products_2024_v1","alias": "current_products"}},{"add": {"index": "products_2024_v2","alias": "current_products"}}]
}

场景2:分片查询

# 创建按月分片的索引
PUT /logs_2023-01
PUT /logs_2023-02
PUT /logs_2023-03# 创建全局别名
POST /_aliases
{"actions": [{"add": {"index": "logs_2023-*","alias": "logs_2023"}}]
}# 查询时可以使用别名查询所有分片
GET /logs_2023/_search
{"query": {"match_all": {}}
}

4.5 注意事项

  • 性能考虑
    • 别名指向多个索引时,查询会分散到所有索引
    • 过多的索引可能导致查询性能下降
  • 写入限制
    • 一个别名只能指向一个索引时才能用于写入操作
    • 多索引别名只能用于读取
  • 过滤别名
    • 过滤条件会增加查询开销
    • 复杂的过滤条件可能影响性能
  • 别名与索引关系
    • 删除索引不会自动删除关联的别名
    • 别名可以独立于索引存在
  • 权限控制
    • 确保应用程序只有别名访问权限而非实际索引
    • 可以通过别名实现数据访问隔离
  • 监控与维护
    • 定期检查别名配置是否正确
    • 避免创建循环引用

4.6 实际应用案例

电商平台商品索引管理

  • 初始设置
PUT /products_v1
POST /_aliases
{"actions": [{"add": {"index": "products_v1","alias": "products"}}]
}
  • 应用代码始终使用 products 别名
# 查询
GET /products/_search# 写入
POST /products/_doc
  • 需要重建索引时
# 创建新索引
PUT /products_v2
{"settings": {"number_of_shards": 5},"mappings": {"properties": {"name": { "type": "text" },"price": { "type": "scaled_float", "scaling_factor": 100 }}}
}# 导入数据到新索引...# 原子切换
POST /_aliases
{"actions": [{"remove": {"index": "products_v1","alias": "products"}},{"add": {"index": "products_v2","alias": "products"}}]
}# 可选的:删除旧索引
DELETE /products_v1

通过这种方式,应用代码不需要任何修改即可切换到新索引,实现了零停机索引迁移。

5.索引模板

5.1 什么是索引模板?

索引模板Index Template)是 Elasticsearch 中一种自动为新创建的索引应用预定义配置(包括设置、映射和别名)的机制。当新索引的名称与模板中定义的模式匹配时,Elasticsearch 会自动将模板中的配置应用到该索引。

5.2 索引模板主要解决的业务问题

  • 标准化配置管理:确保遵循统一的索引结构标准。
  • 自动化索引创建:减少人工干预和配置错误。
  • 大规模索引管理:简化大量相似索引的管理工作。
  • 动态索引场景:处理按时间、业务分片的索引(如日志、时间序列数据)。
  • 一致性保障:确保所有匹配索引具有相同的设置和映射。

5.3 索引模板类型

Elasticsearch 7.8 + 7.8+ 7.8+ 支持两种模板类型:

  • 传统模板Legacy Templates):适用于索引。
  • 组件模板Component Templates):可复用的模板模块。

5.4 具体实现方法

5.4.1 创建简单索引模板

PUT /_index_template/logs_template
{"index_patterns": ["logs-*"],  // 匹配所有以logs-开头的索引"template": {"settings": {"number_of_shards": 3,"number_of_replicas": 1,"index.lifecycle.name": "logs_policy"  // 关联ILM策略},"mappings": {"properties": {"@timestamp": {"type": "date"},"level": {"type": "keyword"},"message": {"type": "text"},"service": {"type": "keyword"}}},"aliases": {"all_logs": {}  // 为匹配索引自动添加别名}},"priority": 200,  // 优先级(越高越优先)"version": 1,"_meta": {"description": "日志索引模板"}
}

5.4.2 使用组件模板(更模块化)

# 创建组件模板1:基础设置
PUT /_component_template/logs_settings
{"template": {"settings": {"number_of_shards": 3,"number_of_replicas": 1,"index.lifecycle.name": "logs_policy"}}
}# 创建组件模板2:日志映射
PUT /_component_template/logs_mappings
{"template": {"mappings": {"properties": {"@timestamp": { "type": "date" },"level": { "type": "keyword" },"message": { "type": "text" }}}}
}# 组合组件模板创建索引模板
PUT /_index_template/logs_composite_template
{"index_patterns": ["logs-*"],"composed_of": ["logs_settings", "logs_mappings"],"priority": 200,"version": 2
}

5.5 实际应用案例

案例 1:电商平台订单索引

业务需求:每天创建一个新索引存储订单数据,确保所有订单索引结构一致

PUT /_index_template/orders_daily_template
{"index_patterns": ["orders-*"],"template": {"settings": {"number_of_shards": 5,"number_of_replicas": 2,"index.refresh_interval": "30s"},"mappings": {"properties": {"order_id": { "type": "keyword" },"customer_id": { "type": "keyword" },"order_date": { "type": "date" },"amount": { "type": "double" },"items": {"type": "nested","properties": {"product_id": { "type": "keyword" },"quantity": { "type": "integer" },"price": { "type": "double" }}}}},"aliases": {"current_orders": {}}},"priority": 100
}# 每天自动创建索引(应用会使用日期创建索引如orders-2023-10-01)
# 由于匹配orders-*模式,模板配置会自动应用

案例 2:多租户 SaaS 应用

业务需求:为每个客户创建独立索引,但保持统一结构

PUT /_index_template/tenant_data_template
{"index_patterns": ["tenant_*"],"template": {"settings": {"number_of_shards": 2,"analysis": {"analyzer": {"tenant_analyzer": {"type": "custom","tokenizer": "standard","filter": ["lowercase"]}}}},"mappings": {"properties": {"tenant_id": { "type": "keyword" },"content": {"type": "text","analyzer": "tenant_analyzer"},"created_at": { "type": "date" }}}}
}# 当创建tenant_acme、tenant_xyz等索引时,模板会自动应用

5.6 使用时注意事项

  • 优先级冲突
    • 多个模板可能匹配同一个索引名称。
    • 使用 priority 字段明确优先级(数值越大优先级越高)。
    • 建议为不同模式设置明确的优先级。
  • 模板应用时机
    • 只在索引创建时应用。
    • 对已有索引的修改不会触发模板重新应用。
  • 版本控制
    • 使用 version 字段跟踪模板版本。
    • 更新模板时递增版本号。
  • 索引模式设计
    • 模式应足够具体以避免意外匹配。
    • logs-app-*logs-* 更明确。
  • 组件模板优势
    • 7.8+ 版本推荐使用组件模板。
    • 提高配置复用性。
    • 便于维护和更新。
  • 系统模板
    • Elasticsearch 有内置系统模板(如 .monitoring-*)。
    • 避免与系统模板冲突。
  • 模板查看与管理
    # 查看所有模板
    GET /_index_template# 查看特定模板
    GET /_index_template/<template_name># 删除模板
    DELETE /_index_template/<template_name>
    
  • 测试验证
    • 使用模拟索引创建测试模板效果。
    POST /_index_template/_simulate/index/test_logs-001
    {"index_patterns": ["logs-*"],"template": {"settings": {"number_of_shards": 2}}
    }
    

5.7 最佳实践建议

  • 命名规范
    • 为模板使用描述性名称(如 ecommerce_orders_template)。
    • 索引模式使用明确的前缀/后缀(如 metric-*-prod)。
  • 文档化
    • 使用 _meta 字段记录模板用途和变更历史。
    "_meta": {"description": "用于存储所有产品日志","created_by": "data_team","version": "1.1"
    }
    
  • 版本控制
    • 将模板配置纳入版本控制系统。
    • 实现模板的 CI/CD 流程。
  • 监控模板使用
    • 定期检查哪些索引应用了哪些模板。
    • 监控模板匹配情况。
  • 与 ILM 策略结合
    "settings": {"index.lifecycle.name": "hot_warm_cold_policy","index.lifecycle.rollover_alias": "logs_alias"
    }
    

通过合理使用索引模板,可以显著提高 Elasticsearch 集群的管理效率,确保索引配置的一致性,并为动态索引场景提供自动化支持。


http://www.hkcw.cn/article/ONQAZIWjyF.shtml

相关文章

玩客云 OEC/OECT 笔记(2) 运行RKNN程序

目录 玩客云 OEC/OECT 笔记(1) 拆机刷入Armbian固件玩客云 OEC/OECT 笔记(2) 运行RKNN程序 RKNN OEC/OEC-Turbo 使用的芯片是 RK3566/RK3568, 这个系列是内建神经网络处理器 NPU 的, 利用 RKNN 可以部署运行 AI 模型利用 NPU 硬件加速模型推理. 要使用 NPU, 首先需要在电脑使…

【音视频】FFmpeg 硬件(NVDIA)编码H264

FFmpeg 与x264的关系 ffmpeg软编码是使⽤x264开源项⽬&#xff0c;也就是说ffmpeg软编码H264最终是调⽤了x264开源项⽬&#xff0c;所以我们要先理解ffmpeg和x264的调⽤关系&#xff0c;这⾥我们主要关注x264_init。对于x264的参数都在 ffmpeg\libavcodec \libx264.c x264\co…

深度学习和神经网络 卷积神经网络CNN

1.什么是卷积神经网络 一种前馈神经网络&#xff1b;受生物学感受野的机制提出专门处理网格结构数据的深度学习模型 核心特点&#xff1a;通过卷积操作自动提取空间局部特征&#xff08;如纹理、边缘&#xff09;&#xff0c;显著降低参数量 2.CNN的三个结构特征 局部连接&a…

论文略读:LIMO: Less is More for Reasoning

202502 arxiv 在数学推理领域&#xff0c;论文提出的LIMO仅用 817 条精心设计的训练样本&#xff0c;借助简单的监督微调&#xff0c;就全面超越了使用十万量级数据训练的主流模型 最近的大模型在预训练阶段已纳入海量数学知识&#xff08;比如Llama 3 仅在数学推理上的训练数…

web架构3------(nginx的return跳转,gzip压缩,目录浏览,访问控制和location符号优先级)

一.前言 本期继续来介绍nginx的各项配置&#xff0c;看着内容很多&#xff0c;但是主要还是介绍&#xff0c;内容还是很少的。 二.return和rewrite跳转 在我们配置ssl证书之后&#xff0c;如果把https的s去掉&#xff0c;就相当于去访问80端口了&#xff0c;https默认找的是…

大楼智能化建设设计方案(Word)

第一章 智能化设计 4 1.1 项目概况 4 1.2 设计原则 4 1.3 设计依据 6 1.4 项目总体规划 7 1.5 综合布线系统 8 1.5.1 综合布线系统 8 1.5.2 楼宇分机房系统 20 1.5.3 有线电视网 27 1.6 建筑智能化系统 37 1.6.1 周界防范系统 37 1.6.2 电子巡更系统 38 1.6.3…

Spring AI 之检索增强生成(Retrieval Augmented Generation)

检索增强生成&#xff08;RAG&#xff09;是一种技术&#xff0c;有助于克服大型语言模型在处理长篇内容、事实准确性和上下文感知方面的局限性。 Spring AI 通过提供模块化架构来支持 RAG&#xff0c;该架构允许自行构建自定义的 RAG 流程&#xff0c;或者使用 Advisor API 提…

【C++/Linux】TinyWebServer前置知识之IP协议详解

目录 IPv4地址 分类 IP数据报分片 IP 协议在传输数据报时&#xff0c;将数据报分为若干分片&#xff08;小数据报&#xff09;后进行传输&#xff0c;并在目的系统中进行重组&#xff0c;这一过程称为分片&#xff08;Fragmentation&#xff09;。 IP模块工作流程​编辑 I…

破局软件开发困境:一套‘一模到底‘的功能模型,如何撬动软件工程全数字化管控?

软件工程如同一场复杂的交响乐&#xff0c;功能模型是乐谱的主旋律&#xff0c;而需求、设计、开发、测试、运维、用户反馈、Bug、版本、状态等则是丰富的配器和节奏。传统模式下&#xff0c;这些元素常常各自为营&#xff0c;声部混乱&#xff0c;难以奏出和谐的乐章。如何才能…

RAG入门 - Retriever(1)

文章目录 环境准备知识库加载1. Retriever - embeddings &#x1f5c2;️1.1 将文档拆分为chunks1.2 词嵌入1.3 构建向量数据库Nearest Neighbor search algorithm &#xff08;最近邻搜索算法&#xff09;Distances &#xff08;距离&#xff09;点积&#xff08;Dot Product&…

Pyomo中线性规划接口的使用

之前在 Pyomo介绍-CSDN博客 中以饮食为例介绍过Pyomo的使用&#xff0c;执行以下命令&#xff1a; pyomo solve --solverglpk test_pyomo_linear_programming.py ../test_data/diet.dat 直接执行以上命令&#xff0c;不便之处有以下几点&#xff1a; (1).不能直接解析python文…

打开一个新的Maven工程要做的事情

新导入项目变成maven 1、检查环境配置 2.看有没有maven 3.在idea中配置maven 4、让配置文件添加到maven项目中 变成这样基本就成功了 调出service界面 可以同时选中启动多个项目 这里可以同时关闭多个项目

GNURadio实现MIMO OFDM文件传输

文章目录 前言一、理论基础二、使用方法1、打开虚拟机2、输入密码3、运行 grc 文件4、运行 三、流图及运行结果1、MIMO_simulation.grc2、MIMO_tx.grc3、MIMO_rx.grc 四、资源自取 前言 使用 GNU Radio Companion 驱动 USRP N320 实现 MIMO OFDM 收发测试。&#xff08;Ubuntu…

达梦数据库 Windows 系统安装教程

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

【Day43】

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 今天代码见个人 Gitee仓库&#xff1a;LOVE/Python学习库https://gitee.com/love_hub/python-learning-library Github仓库&a…

贪心算法应用:装箱问题(BFD算法)详解

贪心算法应用&#xff1a;装箱问题(BFD算法)详解 1. 装箱问题与BFD算法概述 1.1 装箱问题定义 装箱问题(Bin Packing Problem)是组合优化中的经典问题&#xff0c;其定义为&#xff1a; 给定n个物品&#xff0c;每个物品有大小wᵢ (0 < wᵢ ≤ C)无限数量的箱子&#xf…

mysql(十五)

目录 子查询 1.准备工作 2--创建表格 3--插入数据 2.where 子查询单列单个数据 格式 查询 3.where 子查询单列多个数据(in) 格式 查询 使用子查询 4.from 多行多数据 格式 查询 子查询 将select的查询的返回结果 当成另外一个selet语句的内容去使用。 子查询放在()里面 注意…

Unity 环境搭建

Unity是一款游戏引擎&#xff0c;可用于开发各种类型的游戏和交互式应用程序。它由Unity Technologies开发&#xff0c;并在多个平台上运行&#xff0c;包括Windows、macOS、Linux、iOS、Android和WebGL。Unity也支持虚拟现实(VR)和增强现实(AR)技术&#xff0c;允许用户构建逼…

从0开始学习R语言--Day15--非参数检验

非参数检验 如果在进行T检验去比较两组数据差异时&#xff0c;假如数据里存在异常值&#xff0c;会把数据之间的差异拉的很大&#xff0c;影响正常的判断。那么这个时候&#xff0c;我们可以尝试用非参数检验的方式来比较数据。 假设我们有A&#xff0c;B两筐苹果&#xff0c…

NX847NX855美光固态闪存NX862NX865

NX847NX855美光固态闪存NX862NX865 美光固态闪存技术深度解析&#xff1a;NX847、NX855、NX862、NX865的多维探索 一、技术架构与核心优势 美光NX系列固态闪存的卓越性能源于其底层技术的创新突破。以G9 NAND技术为核心的产品线&#xff08;如NX865&#xff09;&#xff0c;…