汇总搜索限制
编辑汇总搜索限制
编辑虽然我们认为汇总功能非常灵活,但汇总数据的性质意味着会有一些限制。一旦实时数据被丢弃,您将总是会失去一些灵活性。
此页面重点介绍主要的限制,以便您了解它们。
每次搜索仅允许一个汇总索引
编辑当使用汇总搜索端点时,index
参数接受一个或多个索引。这些索引可以是常规的非汇总索引和汇总索引的混合。但是,只能指定一个汇总索引。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
,但仅限于组件的子集。当前允许的查询是
- Term Query
- Terms Query
- Range Query
- MatchAll Query
- 任何复合查询(Boolean、Boosting、ConstantScore 等)
此外,这些查询只能使用也在汇总作业中保存为 group
的字段。如果您希望按关键字 hostname
字段进行过滤,则该字段必须已在汇总作业中的 terms
分组下配置。
如果您尝试使用不支持的查询,或者查询引用的字段未在汇总作业中配置,则会抛出异常。我们希望随着更多查询的实现,支持的查询列表会随着时间的推移而增加。
时区
编辑汇总文档存储在作业中 date_histogram
组配置的时区中。如果未指定时区,则默认情况下以 UTC
汇总时间戳。