汇总搜索限制

编辑

在 8.11.0 版本中已弃用。

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

虽然我们认为汇总功能非常灵活,但数据汇总的本质意味着会有一些限制。一旦实时数据被丢弃,您将始终失去一些灵活性。

此页面重点介绍了主要的限制,以便您了解这些限制。

每次搜索只能使用一个汇总索引

编辑

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

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

此限制是由决定哪些作业最适合任何给定查询的逻辑驱动的。如果在一个索引中存储了十个作业,这些作业以不同的完整程度和不同的间隔覆盖源数据,则查询需要确定实际搜索哪些作业集。错误的决策会导致不准确的聚合结果(例如,文档计数过多或指标错误)。不用说,这是一段技术上具有挑战性的代码。

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

只能聚合已存储的内容

编辑

这是一个可能很明显的限制,但汇总只能对已存储在汇总中的数据进行聚合。如果您没有将汇总作业配置为存储关于price字段的指标,则不能在任何查询或聚合中使用price字段。

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

resp = client.rollup.rollup_search(
    index="sensor_rollup",
    size=0,
    aggregations={
        "avg_temperature": {
            "avg": {
                "field": "temperature"
            }
        }
    },
)
print(resp)
response = client.rollup.rollup_search(
  index: 'sensor_rollup',
  body: {
    size: 0,
    aggregations: {
      avg_temperature: {
        avg: {
          field: 'temperature'
        }
      }
    }
  }
)
puts response
const response = await client.rollup.rollupSearch({
  index: "sensor_rollup",
  size: 0,
  aggregations: {
    avg_temperature: {
      avg: {
        field: "temperature",
      },
    },
  },
});
console.log(response);
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 可以对每小时或更大的任何时间间隔进行聚合。小于一小时的时间间隔将抛出异常,因为对于更精细的粒度,数据根本不存在。

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

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

有限的查询组件

编辑

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

  • 术语查询
  • 术语组查询
  • 范围查询
  • 匹配所有查询
  • 任何复合查询(布尔型、提升型、常数分数型等)

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

如果您尝试使用不受支持的查询,或者查询引用未在汇总作业中配置的字段,则会抛出异常。我们预计随着更多查询的实现,支持的查询列表会随着时间的推移而增长。

时区

编辑

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