搜索查询语法

搜索资产时,您可以通过指定由资产元数据字段、运算符和值组成的查询来过滤搜索结果。

可搜索的字段和资源

如需了解可以在 searchAllResources 查询中使用的字段,请参阅 ResourceSearchResult 字段

如需了解您可以在 searchAllIamPolicies 查询中使用的字段,请参阅 IamPolicySearchResult 字段

如需了解您可以搜索的资源,请参阅资源类型

文本匹配

搜索文本匹配项时,您可以完全部分匹配资产元数据字段。

完全匹配文本

如需进行文本完全匹配,请使用 =(等于)运算符,并采用以下语法:

ASSET_METADATA_FIELD=QUERY

例如:

location=us-central1-a

执行完全匹配时,请注意以下规则:

  • 为了让查询为 true,查询值必须与资产元数据字段的值完全匹配。

  • 对于具有列表值的字段,如果查询值与列表的某个元素匹配,则被视为匹配。

  • 查询值区分大小写。

  • 完全匹配查询值会被视为词组,但不能包含通配符

部分文本匹配

对于文本部分匹配,请使用 :(包含)运算符,语法如下:

ASSET_METADATA_FIELD:QUERY

例如:

location:us-central1

使用 : 运算符执行搜索时,系统会将查询值和资产元数据字段值转换为令牌,以进行比较。系统会检查查询值的每个字词,以确定其是否在资产元数据字段的值中以连续顺序存在。使用部分匹配时,查询值不区分大小写。

部分匹配查询值可以是短语或多个短语的组合,并且可以包含通配符。一个查询中最多可以进行 10 项比较,并且最多可以包含 2048 个字符。如果您有更长查询的用例,请联系 gcp-asset-inventory-and-search-feedback@googlegroups.com

令牌化规则

部分文本匹配的标记化规则如下:

  • 系统会移除开头和结尾的特殊字符。

  • 非字母数字字符 ([a-zA-Z0-9])、下划线 (_) 或 ampersand (&) 字符会被视为分隔符。

以下是一些词法单元化示例:

  • us-central1 词法单元化为 [us,central1]

  • alex-2020@EXAMPLE.com 词法单元化为 [alex,2020,example,com]

  • google.com/cloud 词法单元化为 [google,com,cloud]

  • Compute %Instance% 词法单元化为 [compute,instance]

  • $%^*-! 词法单元化为 []

  • compute*storage 词法单元化为 [compute,storage]

  • compute&storage 词法单元化为 [compute&storage]

  • ALEX_test@example.com 词法单元化为 [alex_test,example,com]

  • instance/_my_vm_ 词法单元化为 [instance,_my_vm_]

完全匹配和部分文本匹配示例

location 字段值为 us-central1-a 的资源与以下查询匹配。

查询 匹配原因
location=us-central1-a
匹配的原因是词组 us-central1-a 与字段值完全一样。
location:US-Central1-A
匹配的原因是标点符号被视为分隔符,并且查询值不区分大小写。
location:"us central1 a"
匹配的原因是短语 "us central1 a" 中的字词与字段值按顺序匹配。
location:(central1 us a)
匹配的原因是组合 (central1 us a) 中的字词与字段值中的字词在任意顺序下匹配。
location:(a "us central1")
匹配的原因是组合中的短语 a"us central1" 与字段值中的字词(不限顺序)匹配。由于 "us central1" 是一个短语,因此这些字词必须按顺序匹配。
location:us-central*
匹配的原因是通配符 * 用于进行前缀匹配。

location 字段的值为 us-central1-a 的资产与以下查询不匹配。

查询 不匹配的原因
location=US-central1-a
不匹配,因为词组区分大小写。请改用 : 运算符进行不区分大小写匹配。
location=us-central1
不匹配,因为词组部分与字段的值匹配。 请改用 : 运算符进行部分匹配。

构建文本匹配查询

查询值可以由短语、组合、否定和通配符组成。

短语

短语是按顺序匹配的一个或多个字词。如需不考虑顺序地匹配字词,请改用组合

以下查询会与 policy 字段中包含字词 alex 和字词 2020 且顺序相连的资产匹配:

policy:"alex 2020"

policy 字段值为 "alex.2020@example.com" 的资产与该查询匹配,因为 alex2020 是连续的字词。系统会忽略 .,因为标点符号会被视为分隔符。

如果 policy 字段值为 "2020.alex@example.com""alex.us.2020@example.com" 的资源不匹配,是因为 alex2020 这两个字词不在连续顺序中。

构建指令

构建短语时,请注意以下规则:

  • 如果短语仅包含 ISO 基本拉丁字母字符 [a-zA-Z]、数字 [0-9]、基本电子邮件或网址连接符 [_-+.@/&] 或通配符 [*],则无需将其用双引号引起:

    policy:alex.2020@example.com
    

    不过,使用英文双引号括起来仍然有效,并且行为方式相同:

    policy:"alex.2020@example.com"
    
  • 如果字词包含空格或其他特殊字符,则必须用双引号括起来:

    location:"us central1"
    
  • 如果字词用英文双引号括起来,并且还包含英文双引号 (") 或反斜杠 (\),您必须将它们转义为 \"\\。或者,将其替换为单个空格,因为在执行搜索时,非字母数字字符被视为分隔符。以下查询的处理方式相同:

    description:"One of \"those\" descriptions."
    description:"One of those descriptions."
    
  • 使用 gcloud CLI 或 REST API 时,您需要对用于表示字词的双引号进行转义:

    --query="location:(a \"us central1\")"
    
    "query": "location:(a \"us central1\")"
    

组合

搜索短语可以使用大写逻辑运算符 ANDOR 进行组合。使用圆括号时,添加 AND 是可选的。例如,以下查询会被视为相同:

policy:(alex charlie)
policy:(alex AND charlie)

如果资源包含包含值列表的元数据字段,则 AND 组合无法保证所有字词都必须位于单个元素中。例如,如果元数据字段为 policy=["alex@example.com", "bola@example.com", "charlie@example.com"],则使用 policy:(alex charlie) 进行搜索时会匹配,因为 alex@example.com 包含 alex,而 charlie@example.com 包含 charlie

您可以使用括号对组合类型进行分组。以下示例会返回政策字段包含 alexcharlie(顺序不限)的资源,或政策字段包含 bola 的资源。

policy:((alex charlie) OR bola)

您可以在组合中使用词组来匹配连续顺序的多个字词。以下示例返回政策字段包含 alex2020bola 的资产:

policy:(("alex 2020") OR bola)

组合示例

以下查询展示了各种组合。请注意括号的位置,以便分隔 ANDOR 运算符。在单个括号内组合运算符无效,例如:policy:(alex charlie OR bola)

查询 说明
policy:(alex charlie)
返回 policy 字段同时包含 alexcharlie 的资源。
policy:(alex OR charlie)
返回 policy 字段包含 alexcharlie 的资源。
policy:((alex charlie) OR bola)
返回 policy 字段同时包含 alexcharlie 或包含字词 bola 的资源。
policy:(alex charlie) OR name:bola
返回 policy 字段包含 alexcharliename 字段包含 bola 的资源。

取反

您可以使用大写的 NOT 运算符对搜索查询进行否定。支持使用圆括号,但并非必需。

否定示例

  • 返回 state 字段不包含 running 一词的资产。

    NOT state:running
    
  • 返回 policy 字段既不包含 alex 也不包含 charlie 的资产。

    NOT policy:(alex OR charlie)
    
  • 返回 networkTags 字段不包含 internalprivate 的资产。

    NOT (networkTags:internal OR networkTags:private)
    

通配符

星号 (*) 可以在短语中用作通配符。星号的含义因位置而异。

  • 如果 * 位于短语的末尾,则会被视为令牌前缀匹配。例如,"al 20*" 等同于 (al* 20*)。前缀的顺序无关紧要。

    字词 "al 20*" 会与以 al 开头的令牌(例如 alex)和以 20 开头的令牌(例如 2020)匹配的字段值。

  • 对于 labels,如果整个查询值仅包含一个 *(例如 "labels.env:*"),则表示存在性检查。也就是说,Cloud Asset Inventory 会检查标签键 env 是否存在。只有 labels 字段支持存在性检查。

  • 如果 * 位于短语中间(例如 "compute*storage"),则系统会将其视为词法单元分隔符。此查询值等于 "compute storage"

  • 如果 * 既位于短语的开头,又位于短语的末尾(例如 "*compute storage*"),则被视为令牌化分隔符。此查询值等同于 "compute storage"

数值和时间戳比较

对于数值和时间戳比较,请使用以下语法中的比较运算符:

ASSET_METADATA_FIELD>=QUERY

可用的比较运算符如下所示:

  • =:等于

  • >:大于

  • >=:大于或等于

  • <:小于

  • <=:小于或等于

如需与时间戳(例如存储在 createTimeupdateTime 资产元数据字段中的时间戳)进行比较,请使用 64 位有符号整数(以秒为单位的纪元时间戳)或采用以下格式之一的 UTC+0 日期时间字符串:

  • 2021-01-01(YYYY-MM-DD)

  • "2021-01-01T00:00:00" ("YYYY-MM-DDThh:mm:ss")

日期时间示例

createTime 字段值为 1609459200(新纪元时间戳为 2021-01-01T00:00:00)的资源与以下查询匹配:

createTime=1609459200
createTime=2021-01-01
createTime="2021-01-01T00:00:00"

createTime>1500000000
createTime>2020-01-01
createTime>"2020-01-01T00:00:00"

createTime>=1609459200
createTime>=2021-01-01
createTime>="2021-01-01T00:00:00"

createTime<1700000000
createTime<2022-01-01
createTime<"2022-01-01T00:00:00"

createTime<=1609459200
createTime<=2021-01-01
createTime<="2021-01-01T00:00:00"