以程式設計方式使用進階查詢語法

進階查詢語法 (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,它們都會從左至右系結。 也就是說,查詢「apple AND pear OR plum」會解譯為「 (apple AND pear) OR plum」,而查詢「apple OR pear AND plum」會解譯為「 (apple OR pear) AND plum」。 因此,如果檔包含 plum 一字,但不是 apple 或 pear,則第一個查詢會傳回它,但第二個查詢則不會。 因此,建議您針對混合 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 時區。

  • 不含 UTC 時區的 Windows 8 和更早版本日期時間:YYYY-MM-DDThhmmss

    不論使用者或系統地區設定為何,此格式都會指定當地時間。

  • Windows 8,含 UTC 時區的日期時間:YYYY-MM-DDThhmmssTZD

    此格式會指定指定 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₁ 到 Nk 的列舉值或範圍, 則第 I個值或範圍的標準語法是 P 標準名稱,後面接著 字元 #,後面接著 NI,如下列範例所示:
    • System.Photo.LightSource#DaylightSystem.Photo.LightSource#StandardA 、 等等。
  • 針對具有 N₁ 到 Nk 之值或範圍的已定義語意類型 T, 第 I個值或範圍的標準語法是 T 標準名稱,後面接著 字元 #,後面接著 NI,如下列範例所示:
    • System.Devices.LaunchDeviceStageFromExplorer:=System.StructuredQueryType.Boolean#True
  • 對於字組或片語等常值,標準語法與一般語法相同。 標準語法中具有常值之查詢的範例包括:
    • System.Author:sanjay
    • System.Keywords:"Animal"
    • System.FileCount:>100

注意

Windows 7 和更新版本中的數位沒有標準語法。 由於浮點格式會因地區設定而異,因此不支援使用涉及浮點常數的標準查詢。 相反地,整數常數只能使用數位來撰寫, (數千個) 沒有分隔符號,而且可以在 Windows 7 和更新版本的標準查詢中安全地使用。

 

範例

下表顯示標準屬性的一些範例,以及使用這些屬性的語法。

標準屬性的類型 範例 Syntax
字串值 System.Author
系統會在 author 屬性中搜尋字串值:
System.Author:Jacobs
列舉範圍 System.Priority priority 屬性可以有數值範圍:
System.Priority:System.Priority#High
Boolean System.IsDeleted
布林值可以搭配任何布林值屬性使用:
System.IsDeleted:System.StructuredQueryType.Boolean#TrueSystem.IsDeleted:System.StructuredQueryType.Boolean#False
數值 System.Size
您無法安全地撰寫涉及浮點常數的標準查詢,因為浮點格式會因地區設定而有所不同。 整數必須寫入,且沒有千位分隔符號。 例如:
System.Size:<12345

 

如需正式屬性和屬性系統一般的詳細資訊,請參閱 系統屬性。 或者,請參閱公用標頭檔。

查詢運算子

如果屬性 p 具有某些專案的多個值,則 p: < restr >> 的 AQS 查詢會針對至少一個值傳回專案。 < < (restr > 代表 restriction.)

下表所列的語法包含運算子、運算子符號、範例和範例描述。 運算子和符號可以用於任何語言,並包含在任何查詢中。 請勿使用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 圖片
System.Kind:- -picture
System.Kind屬性不是圖片。
System.Photo.DateTaken屬性具有 值。
System.Kind屬性不是圖片。
System.Kind屬性不是圖片。
套用至相同屬性的 Double NOT 運算子不會取消。因此,System.Kind:- -picture 相當於 System.Kind:-picture 和 System.Kind:NOT 圖片。
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 rules」 例如。
尋找包含 字元四舍五入之 Autosummary 的所有專案。
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 一個實例」
針對 Windows 7 和更新版本。 尋找所有 From 屬性中的片語 「Sanjay 在」中。 Sanjay這個字後面必須接著一個文字,也就是一個文字。」
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開頭的文字。
引號字串 「」 「結論:有效」 「The」blue「」 team」
任何字元序列。 字串不會解譯為語法的一部分。
雙引號可以包含在查詢中。 此範例會搜尋 「blue」 小組
整數 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 還會辨識 (的相對日期值,例如今天、 明天下一周、下一周、下個) ,以及 星期二星期一等日期 (。星期三) 和月份 (2 月) 。


.. System.ItemDate:11/05/04..11/10/04 System.Size:5kb..10kb
雙句點表示值範圍。 尋找日期介於 11/05/04 和 11/10/04 之間的專案, 包含。
尋找大小介於 5 到 10 kb 之間的專案。

 

範圍限制

使用者可以將其搜尋範圍限制為特定資料夾位置或資料存放區。 例如,如果您使用數個電子郵件帳戶,而且想要將查詢限制為 Microsoft Outlook 或 Microsoft Outlook Express,您可以分別使用 System.Search.Store:mapiSystem.Search.Store:oe 。 下表顯示如何依資料存放區限制搜尋的一些範例。

依資料存放區限制搜尋 關鍵字 範例
檔案 file System.Search.Store:file
Outlook mapi System.Search.Store:mapi
Outlook Express oe System.Search.Store:oe
離線檔案 Csc System.Search.Store:csc
本機磁片磁碟機上的特定資料夾 folder System.ItemFolderNameDisplay:C:「\MyFolder」

 

其他資源

以程式設計方式查詢索引

使用 SQL 和 AQS 方法來查詢索引

使用 ISearchQueryHelper 查詢索引

使用 search-ms 通訊協定查詢索引

使用 Windows 搜尋服務 SQL 語法查詢索引