以编程方式使用高级查询语法
高级查询语法 (AQS) 是 Windows 搜索用于查询索引以及优化和缩小搜索参数的默认查询语法。 开发人员使用 AQS 以编程方式 (生成查询,用户使用 AQS 来缩小其搜索参数) 。 规范 AQS 是在 Windows 7 中引入的,必须在 Windows 7 及更高版本中用于以编程方式生成 AQS 查询。
本主题的组织方式如下:
关于高级查询语法
查询由与 AND、OR 和 NOT 连接的基本查询组成,如以下示例语法所示:
<query> ::=
<basic query>
| ( <query> )
| <query> AND <query>
| <query> <query> // Same as <query> AND <query>
| <query> OR <query>
| NOT <query>
注意
AQS 不区分大小写,但 AND、OR 和 NOT 除外,它们必须全部大写。
如果查询有两个或更多个 AND 或 OR 用法,则无论它是 AND 还是 OR,它们都将从左到右绑定。 也就是说,查询“苹果和梨或李子”将解释为“ (苹果和梨) 或李子”,而查询“苹果或梨和李子”将解释为“ (苹果或梨) 和李子”。 因此,如果文档包含单词 plum,但既不包含 apple,也不包含 pear,则第一个查询将返回它,但第二个查询不会返回。 因此,建议对混合使用 AND 和 OR 的任何查询使用显式括号,以避免错误或误解。
基本查询搜索满足属性限制的项。 基本查询中唯一必需的部分是限制或搜索值。 如果未指定属性,Windows 搜索将搜索所有属性。 <restr> 表示搜索限制。
基本查询的以下形式有效:
<basic query> ::=
<prop>:<basic restr>
| <restr>
属性由作者或大小等关键字 (keyword) 或规范属性名称(如 System.DateModified)指定。 属性的有效形式如下所示:
<prop> ::=
<canonical property name>
| <property label in UI language>
运算符指示操作,如 < 或 =。 有关有效运算符的列表,请参阅本主题后面的查询运算符部分。
基本限制是对属性的简单限制,可以不带括号地写入:
<basic restr> ::=
<value>
| <op><value>
| NOT <basic restr>
| ( <restr> )
限制是一个搜索值,例如数字值或字符串值,可以选择使用 运算符。 限制的有效形式如下:
<restr> ::=
<basic restr>
| <restr> AND <restr>
| <restr> <restr> // Same as <restr> AND <restr>
| <restr> OR <restr>
如果未指定运算符,Windows 搜索会为查询选择最合适的运算符:
- 对于字符串属性,假定COP_WORD_STARTSWITH $< 运算符。
- 对于所有其他属性,假定COP_EQUAL = 运算符。
若要以编程方式使用 AQS,建议始终使用显式运算符。 用于搜索简单值或值范围的有效形式如下:
<value> ::=
<simplevalue>
| <simplevalue> .. <simplevalue>
简单值可以包含以下任意类型:
<simplevalue> ::=
[] // No value, or a null value
| <word> // A sequence of characters without whitespace
| <number> // An integer or a floating point number
| <datetime> // A relative date, or an absolute date and/or time
| <Boolean>
| "..." // A phrase
| <enumeration range>
示例
搜索包含由 Theresa 或 Lee 创作并保存到 MyDocs 文件夹的文档的文档的查询合并了三个基本查询,如下所示:
"last quarter" author:(theresa OR lee) folder:MyDocs
三个基本查询是:
- “上一季度”
- 作者: (特蕾莎·李·)
- folder:MyDocs
使用规范语法的基本查询是:
System.Size:>1kb
属性
属性由关键字 (keyword) 引用,它可以是 Windows 7 及更高版本中的规范属性名称。 Windows UI 中的 AQS 可以使用标签而不是规范属性名称,例如 author 而不是 System.Author。 在 Windows Vista 及更早版本中,无论 UI 语言如何,都可以使用英语标签。 在 Windows 7 及更高版本中,Windows 搜索仅识别当前默认 UI 语言中的关键字。
支持自定义属性
在 Windows Vista 及更早版本中,自定义属性在 AQS 中不可用。 在 Windows 7 及更高版本中,AQS 适用于在属性系统中注册的自定义属性。 有关创建自定义属性的详细信息,请参阅 属性系统。
Windows 8 中的 DateTime 属性
从 Windows 8 起,DateTime 属性 ((如 System.DateModified) )支持 ISO-8601 指定的规范日期和时间格式(可选包括 UTC 时区)。
Windows 8 及更早版本,不带 UTC 时区的日期时间:YYYY-MM-DDThh:mm:ss
此格式指定本地时间,而不考虑用户或系统区域设置。
Windows 8,具有 UTC 时区的日期时间:YYYY-MM-DDThh:mm:ssTZD
此格式指定指定 UTC 时区的时间。
本地语言中的关键字用法
在 Windows 7 及更高版本中,助记键仅适用于系统语言,例如德语关键字仅适用于德语操作系统,英语关键字仅适用于英语操作系统。 例如,System.Author 是规范关键字 (keyword) ,System.Author 属性的助记键值为 Author。 引入规范关键字可以弥补以下事实:无论语言如何,英语助记键不再在所有操作系统上得到普遍认可,就像 Windows Vista 及更早版本中的情况一样。
注意
在 Windows 7 及更高版本中,Windows 搜索仅识别当前默认语言中的关键字,而不识别英语中的关键字,除非英语是当前默认语言。 我们建议开发人员始终使用规范语法,以便其应用程序不会出现关键字语言问题。
Windows 7 中的规范高级查询语法
为 Windows 7 中的关键字引入了规范语法。 具有规范属性的查询的一个示例是 System.Message.FromAddress:=me@microsoft.com
。 在 Windows 7 及更高版本上运行的应用程序中编写查询代码时,必须使用规范语法以编程方式生成 AQS 查询。 如果不使用规范语法,并且应用程序部署的区域设置或 UI 语言与应用程序代码中的语言不同,则无法正确解释查询。
规范关键字 (keyword) 语法的约定如下:
- 属性的规范语法是其规范名称,例如
System.Photo.LightSource
。 规范名称不区分大小写。 - 布尔运算符的规范语法由全大写的关键字 AND、OR 和 NOT 组成。
- 运算符 <、 >、=等未本地化,因此也是规范语法的一部分。
- 如果属性
P
通过 Nk 枚举了名为 N₁ 的值或区域,则 第 I个值或范围的规范语法是 P 的规范名称,后跟字符 #,后跟 NI,如以下示例所示:System.Photo.LightSource#Daylight
、System.Photo.LightSource#StandardA
等。
- 对于定义的语义类型 T,其值或范围名为 N₁ 到 Nk,第 I个值或范围的规范语法是 T 的规范名称,后跟字符 #,后跟 NI,如以下示例所示:
System.Devices.LaunchDeviceStageFromExplorer:=System.StructuredQueryType.Boolean#True
- 对于文字值(如单词或短语),规范语法与常规语法相同。 使用规范语法中的文本值的查询示例包括:
System.Author:sanjay
System.Keywords:"Animal"
System.FileCount:>100
注意
Windows 7 及更高版本中的数字没有规范语法。 由于浮点格式因区域设置而异,因此不支持使用涉及浮点常量的规范查询。 相比之下,整数常量只能使用数字编写, (数千个) 没有分隔符,并且可以安全地用于 Windows 7 及更高版本中的规范查询。
示例
下表显示了规范属性的一些示例以及使用这些规范属性的语法。
规范属性的类型 | 示例 | 语法 |
---|---|---|
字符串值 | System.Author |
在 author 属性中搜索字符串值:System.Author:Jacobs |
枚举范围 | System.Priority | priority 属性可以具有数值范围:System.Priority:System.Priority#High |
布尔 | System.IsDeleted |
布尔值可与任何布尔属性一起使用:System.IsDeleted:System.StructuredQueryType.Boolean#True ,以及 System.IsDeleted:System.StructuredQueryType.Boolean#False |
数值 | System.Size |
无法安全地编写涉及浮点常量的规范查询,因为浮点格式因区域设置而异。 整数必须写入,且不带分隔符的千位。 例如:System.Size:<12345 |
有关规范属性和属性系统一般的详细信息,请参阅 系统属性。 或者,请参阅公共头文件。
查询运算符
如果某个属性 p 对某个项具有多个值,则 p:<restr> 的 AQS 查询在至少一个值中为 true 时><返回该项。 < (restr> 表示限制。)
下表中列出的语法由运算符、运算符符号、示例和示例说明组成。 运算符和符号可用于任何语言,并包含在任何查询中。 请勿使用 COP_IMPLICIT 或 COP_APPLICATION_SPECIFIC 运算符。 某些运算符具有可互换的符号。
操作员 | 符号 | 示例 | 说明 |
---|---|---|---|
COP_EQUAL | = |
System.FileExtension:=“.txt” |
值为字符串“.txt”。 |
COP_NOTEQUAL | ≠ - <> NOT - - |
System.Kind:≠picture System.Photo.DateTaken:-[]¹ System.Kind:<>picture System.Kind:NOT picture System.Kind:- -picture |
System.Kind 属性不是图片。 System.Photo.DateTaken 属性具有值。 System.Kind 属性不是图片。 System.Kind 属性不是图片。 应用于同一属性的双 NOT 运算符不会取消。因此,System.Kind:- -picture 等效于 System.Kind:-picture 和 System.Kind:NOT picture。 |
COP_LESSTHAN | < |
System.Size:<1kb |
此值小于 1kb。 |
COP_GREATERTHAN | > |
System.ItemDate:>System.StructuredQueryType.DateTime#Today |
此值大于 当前值。 |
COP_LESSTHANOREQUAL | <= ≤ |
System.Size:<=1kb |
此值小于或等于 1kb。 |
COP_GREATERTHANOREQUAL | >= ≥ |
System.Size:>=1kb |
此值等于或大于 1kb。 |
COP_VALUE_STARTSWITH | ~< |
System.FileName:~<“C++ Primer” |
查找文件名以字符“C++ Primer”开头的项。 |
COP_VALUE_ENDSWITH | ~> |
System.Photo.CameraModel:~>non |
查找属性值以 非字符结尾的项。 |
COP_VALUE_CONTAINS | ~= ~~ |
System.Subject.~=round System.Search.Autosummary:~~round |
查找主题中具有此字符串的邮件,例如将匹配“ground 规则”。 查找具有包含 四舍五入字符的自动摘要的所有项。 |
COP_VALUE_NOTCONTAINS | ~! |
System.Author:~!”sanjay” |
查找其中没有字符序列“sanjay”的作者。 |
COP_DOSWILDCARDS | ~ |
System.FileName:~“Mic?osoft W*d” |
查找文件名以 Mic 开头的文件,后跟某些字符,后跟 osoft w,后跟以 d 结尾的任何字符。 ? 和 * 字符不按字面解释,其工作方式类似于 DOS 样式的通配符:
|
COP_WORD_EQUAL | $= $$ |
System.StructuredQuery.Virtual.From:$=“Sanjay Jacobs” |
适用于 Windows 7 及更高版本。 在所有 From 属性中查找短语“Sanjay Jacobs”。 桑杰一词后面必须跟着雅各布斯一词。 |
COP_WORD_STARTSWITH | $< |
System.Author:$<“San” System.Filename:$<“Micro Exe” |
适用于 Windows 7 及更高版本。 查找 Author 包含以字符“San”开头的单词的任何项。 查找文件名包含以 micro 开头的单词,后跟以 exe 开头的单词的任何文件。 |
¹ 空方括号 ([]) 表示“无值”。
对于字符串属性,默认操作为 COP_WORD_STARTS_WITH 或 COP_WORD_EQUAL。
查询值
下表列出了有关如何限制查询值的有用示例。
值/符号 | 示例 | 说明 |
---|---|---|
String | auto |
可以搜索的任何字符序列。 字符串不得包含作为语法一部分的空格或字符组合。 此示例搜索以 auto 开头的单词。 |
带引号的字符串“” | “结论: 有效” “蓝色”团队” |
任何字符序列。 字符串不会解释为语法的一部分。 如果引号加倍,则可以在查询中包含引号。 此示例搜索 “蓝色”团队。 |
整数 | 5678 |
仅对整数使用数字。 不要对千位使用任何分隔符。 |
浮点数 | 5678.1234 |
由于浮点格式因区域设置而异,因此规范查询不能使用浮点常量。 将规范语法与浮点数一起使用是不安全的本地化。 |
布尔 值 true/false | System.IsRead:=System.StructuredQueryType.Boolean#True System.IsEncrypted:-System.StructuredQueryType.Boolean#False |
TRUE 布尔值。 FALSE 布尔值。 |
[] | System.Keywords:=[] |
空方括号表示没有值。 此示例查找尚未标记的所有项。 |
绝对日期 | System.ItemDate:1/26/2010 SystemDateModified 2002/10/15 19:00 |
查找日期为 2010 年 1 月 26 日的项目。 查找在 2002 年 10 月 15 日 19:00:00 到 19:00:59 之间修改的项目。 注意: |
相对日期 | System.ItemDate:System.StructuredQueryType.DateTime#Today System.DateAcquired:System.StructuredQueryType.DateTime#NextMonth System.Message.DateReceived:System.StructuredQueryType.DateTime#LastYear |
查找具有今天日期的项。 查找具有下个月日期的项目。 查找具有去年日期的项目。 注意: |
.. | System.ItemDate:11/05/04..11/10/04 System.Size:5kb.。10kb |
双句点指示值范围。 查找日期介于 11/05/04 和 11/10/04(含)的项目。 查找大小在 5 到 10kb 之间的项。 |
范围限制
用户可以将其搜索范围限制为特定的文件夹位置或数据存储。 例如,如果使用多个电子邮件帐户,并且希望将查询限制为 Microsoft Outlook 或 Microsoft Outlook Express,则可以分别使用 System.Search.Store:mapi
或 System.Search.Store:oe
。 下表显示了如何按数据存储限制搜索的一些示例。
按数据存储限制搜索 | 关键字 | 示例 |
---|---|---|
文件 | 文件 | System.Search.Store:file |
Outlook | mapi | System.Search.Store:mapi |
Outlook Express | oe | System.Search.Store:oe |
脱机文件 | Csc | System.Search.Store:csc |
本地驱动器上的特定文件夹 | 文件夹 | System.ItemFolderNameDisplay:C:“\MyFolder” |
其他资源
- 在 Windows 7 及更高版本中,可以根据是否满足 AQS 条件提供快捷菜单选项。 有关详细信息,请参阅 创建上下文菜单处理程序中的“使用高级查询语法获取静态谓词的动态行为”。
- AQS 查询可以限制为特定类型的文件,称为文件类型。 有关详细信息,请参阅 文件类型和关联。 有关属性参考文档,请参阅 System.Kind 和 System.KindText。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈