

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# filterIndex
<a name="CWL_QuerySyntax-FilterIndex"></a>

 使用 `filterIndex` 可以强制查询仅扫描在查询中指定的字段上编制索引的日志组，从而返回已编制索引的数据 对于已在此字段上编制索引的日志组，它会进一步优化查询，跳过没有任何日志事件包含索引字段的查询中指定的字段的日志组。这样可以进一步减少扫描量，因为它会尝试仅扫描这些日志组中与此字段索引的查询中指定的值匹配的日志事件。有关字段索引和如何创建它们的更多信息，请参阅[创建字段索引以提高查询性能并减少扫描量](CloudWatchLogs-Field-Indexing.md)。

将 `filterIndex` 与索引字段结合使用，可以通过将实际搜索空间限制为具有字段索引的日志组和日志事件来帮助您高效地查询包含 PB 级日志数据的日志组。

例如，假设您已经在自己账户的某些日志组中为 `IPaddress` 创建了字段索引。然后，您可以创建以下查询，并选择查询账户中的所有日志组，以查找 `IPaddress` 字段包含值 `198.51.100.0` 的日志事件。

```
fields @timestamp, @message
| filterIndex IPaddress = "198.51.100.0"
| limit 20
```

`filterIndex` 命令会使此查询尝试跳过所有未针对 `IPaddress` 编制索引的日志组。此外，在已编制索引的日志组中，查询会跳过具有 `IPaddress` 字段但未观察到该字段的值为 `198.51.100.0` 的日志事件。

使用 `IN` 运算符可以将结果扩展到索引字段的多个值中的任意一个。以下示例查找 `IPaddress` 字段包含值 `198.51.100.0` 或 `198.51.100.1` 的日志事件。

```
fields @timestamp, @message 
| filterIndex IPaddress in ["198.51.100.0", "198.51.100.1"]
| limit 20
```

CloudWatch 日志为标准日志类中的所有日志组提供默认字段索引。默认字段索引可自动用于以下字段：
+ `@logStream`
+ `@aws.region`
+ `@aws.account`
+ `@source.log`
+ `@data_source_name`
+ `@data_source_type`
+ `@data_format`
+ `traceId`
+ `severityText`
+ `attributes.session.id`

CloudWatch 日志还为某些数据源名称和类型组合提供默认字段索引。默认字段索引自动适用于以下数据源名称和类型组合：


| 数据源名称和类型 | 默认字段索引 | 
| --- | --- | 
|  `amazon_vpc.flow`  |  `action` `logStatus` `region` `flowDirection` `type`  | 
|  `amazon_route53.resolver_query`  |  `query_type` `transport` `rcode`  | 
|  `aws_waf.access`  |  `action` `httpRequest.country`  | 
|  `aws_cloudtrail.data` ` aws_cloudtrail.management`  |  `eventSource` `eventName` `awsRegion` `userAgent` `errorCode` `eventType` `managementEvent` `readOnly` `eventCategory` `requestId`  | 

默认字段索引是对您在策略中定义的任何自定义字段索引的补充。默认字段索引不计入[字段索引配额](CloudWatchLogs-Field-Indexing-Syntax.md)。

## filterIndex 与 filter 之比较
<a name="CWL_QuerySyntax-FilterIndex-Filter"></a>

为了说明 `filterIndex` 和 `filter` 之间的区别，请考虑以下示例查询。假设您已经为四个日志组的 `IPaddress` 创建了字段索引，但没有为第五个日志组创建。以下使用 `filterIndex` 的查询将跳过扫描未为该字段编制索引的日志组。对于每个已编制索引的日志组，它会尝试仅扫描具有索引字段的日志事件，并且仅返回创建字段索引之后的结果。

```
fields @timestamp, @message 
| filterIndex IPaddress = "198.51.100.0" 
| limit 20
```

相反，如果对相同的五个日志组使用 `filter` 而不是 `filterIndex` 进行查询，则查询不仅会尝试扫描已编制索引的日志组中包含该值的日志事件，还会扫描未编制索引的第五个日志组，并且会扫描该第五个日志组中的每个日志事件。

```
fields @timestamp, @message 
| filter IPaddress = "198.51.100.0" 
| limit 20
```