OpenSearch新手技术咨询:Index相关概念差异及数据流疑问
Index(索引)
是OpenSearch中实际存储和检索数据的核心实体,相当于关系型数据库里的"表"。每个索引有独立的映射(mapping,定义字段类型)和设置(settings,比如分片数、副本数),数据直接写入到具体的索引中。
示例:手动创建一个存储2024年5月用户日志的索引
PUT /user_logs_202405 { "settings": { "number_of_shards": 2 }, "mappings": { "properties": { "user_id": {"type": "keyword"}, "log_time": {"type": "date"}, "action": {"type": "text"} } } }
创建完成后,就可以向这个索引写入或查询日志数据。
Index Template(索引模板)
是用于自动生成索引配置的模板规则,提前定义好一组settings、mappings和别名,当创建符合模板匹配规则的索引时,OpenSearch会自动套用模板中的配置,无需手动重复编写。
示例:创建一个匹配所有user_logs_*前缀索引的模板
PUT /_index_template/user_logs_template { "index_patterns": ["user_logs_*"], "template": { "settings": { "number_of_shards": 2 }, "mappings": { "properties": { "user_id": {"type": "keyword"}, "log_time": {"type": "date"}, "action": {"type": "text"} } } }, "priority": 500 }
之后创建user_logs_202406时,无需指定settings和mappings,直接写入数据即可:
POST /user_logs_202406/_doc { "user_id": "u123", "log_time": "2024-06-01T10:00:00", "action": "login" }
Index Pattern(索引模式)
是OpenSearch Dashboards中用于批量管理相似索引的匹配规则,通过通配符匹配一组结构相似的索引,将它们视为一个整体进行查询、可视化操作,无需逐个选择索引。
示例:如果有user_logs_202401到user_logs_202406多个月度日志索引,在Dashboards的"Index Patterns"页面创建user_logs_*模式,设置时间字段为log_time后,就可以直接基于这个模式构建时间序列图表、执行跨索引查询,不用单独操作每个月度索引。
Data Streams(数据流)
是OpenSearch针对**时间序列数据(如日志、监控指标)**设计的抽象层,它背后由多个自动创建的"后台索引"(backing indices)组成,会根据预设规则(如时间、索引大小)自动滚动切换后台索引,无需手动创建和管理新索引,简化了时间序列数据的生命周期管理。
示例:创建并使用数据流
- 先创建匹配数据流的索引模板(必须包含
data_stream: {}字段)
PUT /_index_template/metric_template { "index_patterns": ["metric_stream*"], "data_stream": {}, "template": { "mappings": { "properties": { "@timestamp": {"type": "date"}, "metric_name": {"type": "keyword"}, "value": {"type": "double"} } } } }
- 创建数据流
PUT /_data_stream/metric_stream
- 直接向数据流写入数据,后台会自动创建
metric_stream-000001索引存储数据;当该索引达到阈值(如7天或10GB),会自动生成metric_stream-000002,后续数据自动写入新索引。
POST /metric_stream/_doc { "@timestamp": "2024-06-01T12:00:00", "metric_name": "cpu_usage", "value": 75.2 }
为何部分索引带有数据流,部分没有?
数据流是场景化的特殊抽象,仅适用于需要按时间/大小自动拆分的时间序列数据场景;而普通索引是通用的存储实体,适用于静态数据、无需自动滚动的场景(如用户信息表、产品目录)。
- 当你需要持续写入时序数据,且希望自动管理索引的创建、滚动、删除时,就会使用数据流;
- 若数据是静态的、不需要按时间拆分,或者需要完全手动控制索引配置,就会使用普通索引,自然不会带有数据流。
内容的提问来源于stack exchange,提问作者Java Enthusiast

