以编程方式使用高级查询语法

高级查询语法 (AQS) 是 Windows 搜索用于查询索引以及优化和缩小搜索参数的默认查询语法。 开发人员使用 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,它们均会按从左到右的顺序进行绑定。 换言之,“苹果 AND 梨 OR 李子”查询将按“(苹果 AND 梨)OR 李子”的写法来解释,而“苹果 OR 梨 AND 李子”查询则会按“(苹果 OR 梨)AND 李子”的写法来解释。 因此,如果某一文档包含“李子”一字,但没有“苹果”和“梨”,第一个查询则会返回“李子”,但第二个查询却不会。 因此,建议对混用 AND 和 OR 的所有查询使用显式括号,以免出现错误或错误解释。

基本查询可搜索满足某一属性限制的项目。 基本查询的唯一必要组成部分是限制或搜索值。 如果未指定属性,Windows 搜索则会搜索所有属性。 <restr> 表示搜索限制。

基本查询的以下形式有效:

<basic query> ::=
     <prop>:<basic restr>
| <restr>

属性由关键字(如,作者或大小)或规范属性名称(如 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

这三个基本查询分别为:

  • "上一季度"
  • author:(theresa OR lee)
  • folder:MyDocs

采用规范语法的基本查询为:

System.Size:>1kb

属性

属性由关键字进行引用,而该关键字可为 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 是一个规范关键字,而 System.Author 属性的助记值则是 Author。 规范关键字的引入弥补了英语助记关键字已无法在所有操作系统上被普遍识别而无论语言为何这一事实,如同 Windows Vista 和更早版本中的情况。

注意

在 Windows 7 及更高版本中,Windows 搜索仅会识别采用当前默认语言的关键字,而不是采用英语的关键字(除非英语为当前默认语言)。 我们建议开发人员始终使用规范语法,以确保其应用程序不会出现涉及关键字的语言问题。

 

Windows 7 中的规范高级查询语法

Windows 7 中引入了针对关键字的规范语法。 附带规范属性的查询示例为 System.Message.FromAddress:=me@microsoft.com。 在 Windows 7 及更高版本上运行的应用程序中编写查询代码时,必须使用规范语法并以编程方式生成 AQS 查询。 如果未使用规范语法,且应用程序已用不同于应用程序代码中的语言的其他区域设置或 UI 语言来进行部署,则无法正确解释查询。

规范关键字语法的约定如下:

  • 属性的规范语法为其规范名称,例如 System.Photo.LightSource。 规范名称不区分大小写。
  • 布尔运算符的规范语法由关键字 AND、OR 和 NOT(全部大写)组成。
  • 运算符 <、>、= 等等并未进行本地化,因此它们也属于规范语法。
  • 如果属性 P 已枚举名为 N₁ 到 Nₖ 的值或范围,则第 I 个值或范围的规范语法为 P 的规范名称,且后跟字符 #,接着再后跟 NI,如以下示例所示:
    • System.Photo.LightSource#DaylightSystem.Photo.LightSource#StandardA 等等。
  • 对于附带名为 N₁ 到 Nₖ 的值或范围的已定义语义类型 T,第 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 对于某一项目存在多个值,且 <restr> 对于其中至少一个值为 true,则针对 p:<restr> 的 AQS 查询将返回此项目。 (<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
此值晚于 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
查找属性值以 non 字符结尾的项目。
COP_VALUE_CONTAINS ~=
~~
System.Subject.~=round
System.Search.Autosummary:~~round
查找主题中具有此字符串的消息,并匹配“ground 规则”(例如)。
查找附带 Autosummary 且其中包含字符 round 的所有项目。
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”。 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。

查询值

下表列出了如何限制查询值的实用示例。

值/符号 示例 说明
字符串 auto
可进行搜索的任意字符序列。 该字符串不得包含作为语法一部分的空格或字符组合。 本示例将搜索以 auto 开头的单词。
带引号的字符串 "" "Conclusions: valid" "The ""blue"" team"
任意字符序列。 该字符串不会作为语法的一部分进行解释。
如果引号两次出现,则可在查询中包含引号。 本示例将搜索 The "blue" team
Integer 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 10/15/2002 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
查找具有当天日期的项目。
查找具有下月日期的项目。
查找具有去年日期的项目。

注意:
除搜索特定日期和日期范围外,AQS 还可识别相对日期值(如 todaytomorrownextweeknextmonth)、日(如 TuesdayMonday..Wednesday)和月 (February)。


%> System.ItemDate:11/05/04..11/10/04 System.Size:5kb..10kb
双周期表示值范围。 查找日期介于 11/05/04 和 11/10/04(含)之间的项目。
查找大小介于 5kb 到 10kb 之间的项目。

 

范围限制

用户可将搜索范围限制为特定的文件夹位置或数据存储。 例如,如果使用多个电子邮件帐户且想将查询限制为 Microsoft Outlook 或 Microsoft Outlook Express,则可分别使用 System.Search.Store:mapiSystem.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.KindSystem.KindText

以编程方式查询索引

使用 SQL 和 AQS 方法查询索引

使用 ISearchQueryHelper 查询索引

使用 search-ms 协议查询索引

使用 Windows 搜索 SQL 语法查询索引