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

高级查询语法 (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-DDThhmmss

    此格式指定本地时间,而不考虑用户或系统区域设置。

  • Windows 8,具有 UTC 时区的日期时间:YYYY-MM-DDThhmmssTZD

    此格式指定指定 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#DaylightSystem.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
查找具有今天日期的项。
查找具有下个月日期的项目。
查找具有去年日期的项目。

注意:
除了搜索特定日期和日期范围外,AQS 还识别 (相对日期值,如今天明天下周下月) 和星期二或星期一等 (。星期三) ,月 (二月) 。


.. 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: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 语法查询索引