星形树字段类型
星形树索引预计算聚合,加速聚合查询的性能。如果星形树索引被配置为索引映射的一部分,则在实时摄取数据时,星形树索引会被创建和维护。
如果查询字段是星形树索引维度字段的一部分,并且聚合是针对星形树索引指标字段的,OpenSearch 将自动使用星形树索引来优化聚合。查询语法或请求参数不需要任何更改。
欲了解更多信息,请参阅星形树索引。
先决条件
要使用星形树索引,请按照启用星形树索引中的说明进行操作。
示例
以下示例展示了如何使用星形树索引。
星形树索引映射
在 mappings
中的 composite
部分定义星形树索引映射。
以下示例 API 请求创建一个名为 request_aggs
的相应星形树索引。为了计算 request_size
和 latency
字段的指标聚合,并在 port
和 status
字段上进行查询,请配置以下映射:
PUT logs
{
"settings": {
"index.number_of_shards": 1,
"index.number_of_replicas": 0,
"index.composite_index": true,
"index.append_only.enabled": true
},
"mappings": {
"composite": {
"request_aggs": {
"type": "star_tree",
"config": {
"max_leaf_docs": 10000,
"skip_star_node_creation_for_dimensions": [
"port"
],
"date_dimension" : {
"name": "@timestamp",
"calendar_intervals": [
"month",
"day"
]
},
"ordered_dimensions": [
{
"name": "status"
},
{
"name": "port"
},
{
"name": "method"
}
],
"metrics": [
{
"name": "request_size",
"stats": [
"sum",
"value_count",
"min",
"max"
]
},
{
"name": "latency",
"stats": [
"sum",
"value_count",
"min",
"max"
]
}
]
}
}
},
"properties": {
"@timestamp": {
"format": "strict_date_optional_time||epoch_second",
"type": "date"
},
"status": {
"type": "integer"
},
"port": {
"type": "integer"
},
"request_size": {
"type": "integer"
},
"method" : {
"type": "keyword"
},
"latency": {
"type": "scaled_float",
"scaling_factor": 10
}
}
}
}
星形树索引配置选项
您可以在 mappings
部分使用以下 config
选项来自定义您的星形树实现。这些选项无法在不重新索引的情况下进行修改。
参数 | 描述 |
---|---|
ordered_dimensions | 基于字段列表,这些字段的指标将在星形树索引中聚合。必填。 |
date_dimension | 如果提供了日期维度,则 ordered_dimensions 将追加到其中,以此为基础在星形树索引中聚合指标。可选。 |
metrics | 执行聚合所需的指标字段列表。必填。 |
max_leaf_docs | 叶节点可以指向的最大星形树文档数量。达到最大文档数量后,将根据 ordered_dimension 中下一个字段(如果有)的唯一值创建子节点。默认值为 10000 。较低的值将使用更多存储空间,但查询性能更快。相反,较高的值将使用较少存储空间,但查询性能较慢。欲了解更多信息,请参阅星形树索引结构。 |
skip_star_node_creation_for_dimensions | 一个维度列表,星形树索引将跳过其星节点的创建。当设置为 true 时,这将以牺牲查询性能为代价来减少存储大小。默认值为 false 。有关星节点的更多信息,请参阅星形树索引结构。 |
有序维度
ordered_dimensions
参数包含基于其在星形树索引中聚合指标的字段。只有当查询中的所有字段都是 ordered_dimensions
的一部分时,才会选择星形树索引进行查询。
使用 ordered_dimesions
参数时,请遵循以下最佳实践:
- 维度的顺序很重要。您可以按从最高基数到最低基数的顺序定义维度,以实现高效存储和查询剪枝。
- 避免使用高基数字段作为维度。高基数字段会对存储空间、索引吞吐量和查询性能产生不利影响。
- 每个星形树索引支持最少
2
个,最多10
个维度。
ordered_dimensions
参数支持以下字段类型:
- 所有数值字段类型,不包括
unsigned_long
和scaled_float
keyword
object
对其他字段类型(如 ip
)的支持将在未来版本中添加。有关更多信息,请参阅 GitHub issue #13875。
ordered_dimensions
参数支持以下属性。
参数 | 必需/可选 | 描述 |
---|---|---|
名称 | 必需 | 字段的名称。字段名称应作为索引 mapping 的 properties 部分的一部分存在。确保任何关联字段的 doc_values 设置为 enabled 。 |
日期维度
date_dimension
支持一个 Date
字段,并且总是放在有序维度之上的第一个维度,因为它们通常具有高基数。
date_dimension
最多支持以下三个日历间隔:
year
(纪元年)quarter
(年份的季度)month
(年份的月份)week
(基于周的年份的周)day
(月份中的天)hour
(天中的小时)half-hour
(天中的半小时)quater-hour
(天中的一刻钟)minute
(小时中的分钟)second
(分钟中的秒)
date
字段中的任何值都会根据所提供的日历间隔相关的粒度进行四舍五入。例如:
- 默认的
calendar_intervals
是minute
和half-hour
。 - 在查询期间,会自动选择最近的粒度间隔。例如,如果您已将
hour
和minute
配置为calendar_intervals
,并且您的查询是一个月度日期直方图,那么将自动选择hour
间隔,以便查询以优化的方式计算结果。 - 为了支持基于时区的查询,
:30
等于half-hour
间隔,:15
等于quarter-hour
间隔。
指标
配置您需要执行聚合的任何指标字段。Metrics
是星形树索引配置中必需的一部分。
使用 metrics
时,请遵循以下最佳实践:
- 目前,
metrics
支持的字段是所有数值字段类型,但unsigned_long
除外。有关更多信息,请参阅 GitHub issue #15231。 - 支持的指标聚合包括
Min
、Max
、Sum
、Avg
和Value_count
。Avg
是基于Sum
和Value_count
的派生指标,在运行查询时不会被索引。其余基本指标会被索引。
- 每个星形树索引最多支持
100
个基本指标。
如果为每个字段定义了 Min
、Max
、Sum
和 Value_count
作为 metrics
,则最多可以配置 25 个此类字段,如下例所示:
{
"metrics": [
{
"name": "field1",
"stats": [
"sum",
"value_count",
"min",
"max"
],
...,
...,
"name": "field25",
"stats": [
"sum",
"value_count",
"min",
"max"
]
}
]
}
属性
metrics
参数支持以下属性。
参数 | 必需/可选 | 描述 |
---|---|---|
名称 | 必需 | 字段的名称。字段名称应作为索引 mapping 的 properties 部分的一部分存在。确保任何关联字段的 doc_values 设置为 enabled 。 |
stats | 可选 | 为每个字段计算的指标聚合列表。您可以选择 Min 、Max 、Sum 、Avg 和 Value Count 。默认值为 Sum 和 Value_count 。如果 Sum 和 Value_Count 作为指标 stats 的一部分存在,则 Avg 作为派生指标统计信息将自动在查询中受支持。 |
支持的查询和聚合
有关支持的查询和聚合的更多信息,请参阅星形树索引支持的查询和聚合。