加载中

Elasticsearch 中的汇总搜索限制

8.11.0 版本中已弃用。

汇总功能将在未来版本中移除。请迁移降采样

了解查询汇总数据时的搜索约束。尽管汇总功能非常灵活,但汇总数据的本质意味着存在一些限制。一旦原始实时数据被丢弃,灵活性必然会有所损失。

本页面重点介绍了主要的限制,以便您了解它们。

使用 汇总搜索 端点时,index 参数接受一个或多个索引。这些索引可以是常规的非汇总索引和汇总索引的混合。但是,只能指定一个汇总索引。index 参数的准确规则如下:

  • 必须指定至少一个索引/索引模式。这可以是汇总索引,也可以是非汇总索引。不允许省略 index 参数或使用 _all
  • 可以指定多个非汇总索引
  • 只能指定一个汇总索引。如果提供了多个,将会抛出异常
  • 可以使用索引模式,但如果它们匹配多个汇总索引,将会抛出异常。

此限制源于决定哪些作业对于任何给定查询是“最佳”的逻辑。如果您在单个索引中存储了十个作业,它们以不同程度的完整性和不同的间隔覆盖源数据,则查询需要确定实际要搜索哪些作业集。错误的决策可能导致不准确的聚合结果(例如,文档计数重复计算或错误的指标)。不用说,这是一个在技术上具有挑战性的代码部分。

为了简化问题,我们将搜索限制为一次一个汇总索引(其中可能包含多个作业)。将来,我们也许能够将其扩展到多个汇总作业。

这可能是一个显而易见的限制,但汇总只能聚合存储在汇总中的数据。如果您没有将汇总作业配置为存储有关 price 字段的指标,则无法在任何查询或聚合中使用 price 字段。

例如,以下查询中的 temperature 字段已存储在汇总作业中……但没有使用 avg 指标。这意味着此处不允许使用 avg

				GET sensor_rollup/_rollup_search
					{
  "size": 0,
  "aggregations": {
    "avg_temperature": {
      "avg": {
        "field": "temperature"
      }
    }
  }
}
		

响应将告诉您该字段和聚合是不可能的,因为找不到包含它们的汇总作业

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "There is not a rollup job that has a [avg] agg with name [avg_temperature] which also satisfies all requirements of query.",
        "stack_trace": ...
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "There is not a rollup job that has a [avg] agg with name [avg_temperature] which also satisfies all requirements of query.",
    "stack_trace": ...
  },
  "status": 400
}
		

汇总数据以一定的粒度存储,该粒度由配置中的 date_histogram 组定义。这意味着您只能使用大于或等于所配置汇总间隔的间隔来搜索/聚合汇总数据。

例如,如果数据按小时间隔汇总,则 汇总搜索 API 可以按任何小时或更长的时间间隔进行聚合。小于一小时的间隔将抛出异常,因为更细粒度的数据根本不存在。

请求必须是配置的倍数

可能不会立即显现出来,但聚合请求中指定的间隔必须是配置间隔的整数倍。如果作业配置为按 3d 间隔进行汇总,则只能以三的倍数(3d6d9d 等)进行查询和聚合。

非倍数将无法工作,因为汇总的数据无法与聚合生成的桶干净地“重叠”,从而导致结果不正确。

因此,如果找不到所配置间隔的整数倍,则会抛出错误。

因为 RollupSearch 端点可以“上采样(upsample)”间隔,所以无需配置具有多个间隔(每小时、每天等)的作业。建议配置单个具有所需最小粒度的作业,并允许搜索端点根据需要进行上采样。

话虽如此,如果单个汇总索引中存在多个具有不同间隔的作业,搜索端点将识别并使用具有最大间隔的作业来满足搜索请求。

汇总功能允许在搜索请求中使用 query,但组件子集有限。目前允许的查询有

  • Term 查询
  • Terms 查询
  • Range 查询
  • MatchAll 查询
  • 任何复合查询(Boolean、Boosting、ConstantScore 等)

此外,这些查询只能使用同时也作为 group 保存到汇总作业中的字段。如果您希望对关键字 hostname 字段进行过滤,则必须在汇总作业中将该字段配置在 terms 分组下。

如果您尝试使用不支持的查询,或者查询引用了未在汇总作业中配置的字段,将会抛出异常。我们预计支持的查询列表会随着实现的增加而不断增长。

汇总文档存储在作业中 date_histogram 组配置的时区内。如果未指定时区,则默认为以 UTC 汇总时间戳。

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.