プログラムによる高度なクエリ構文の使用

高度なクエリ構文 (AQS) は、Windows Search がインデックスを照会し、検索パラメータを絞り込むために使用する既定のクエリ構文です。 AQS は、開発者がプロ​​グラムでクエリを構築するために(また、ユーザーが検索パラメータを絞り込むために)使用されます。 正規の AQS は Windows 7 で導入され、Windows 7 以降でプログラムによって AQS クエリを生成するには、正規の AQS を使用する必要があります。

このトピックは次のように構成されています。

高度なクエリ構文について

クエリは、次の例の構文に示すように、AND、OR、NOT で接続された基本クエリで構成されます。

<query> ::=
     <basic query>
| ( <query> )
| <query> AND <query>  
| <query> <query>    // Same as <query> AND <query>
| <query> OR <query> 
| NOT <query>

Note

AQS では大文字と小文字は区別されませんが、AND、OR、NOT はすべて大文字で入力する必要があります。

 

クエリに AND または OR が 2 回以上使用されている場合、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」は含まれていない場合、最初のクエリでは「plum」が返されますが、2 番目のクエリでは返されません。 したがって、間違いや誤解を避けるために、AND と OR を混在させるクエリには明示的な括弧を使用することをお勧めします。

基本的なクエリは、プロパティに対する制限を満たすアイテムを検索します。 基本クエリの唯一の必須部分は、制限または検索値です。 プロパティを指定しない場合、Windows Search はすべてのプロパティを検索します。 <restr> は検索制限を表します。

基本的なクエリの有効な形式は次のとおりです。

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

プロパティは、author や size などのキーワード、または 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 Search によってクエリに最も適した演算子が選択されます。

  • 文字列プロパティの場合、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 フォルダーに保存された、「前四半期」というフレーズを含むドキュメントを検索するクエリは、次のように 3 つの基本クエリを組み合わせます。

"last quarter" author:(theresa OR lee) folder:MyDocs

基本的なクエリは次の 3 つです。

  • 「最終四半期」
  • 著者:(theresa OR lee)
  • フォルダ:MyDocs

標準的な構文を使用する基本的なクエリは次のとおりです。

System.Size:>1kb

プロパティ

プロパティはキーワードによって参照されます。これは、Windows 7 以降では正規のプロパティ名になります。 Windows UI の AQS では、正規のプロパティ名の代わりにラベルを使用できます (例: System.Author の代わりに author)。 Windows Vista 以前では、UI 言語に関係なく英語のラベルを使用できました。 Windows 7 以降では、Windows Search は現在の既定の 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 以前と同様に、英語のニーモニック キーワードが言語に関係なくすべてのオペレーティング システムで普遍的に認識されなくなったという事実が補われます。

Note

Windows 7 以降では、Windows Search は現在の既定の言語でのみキーワードを認識し、英語が現在の既定の言語でない限り、英語のキーワードは認識しません。 アプリケーションでキーワードに関する言語の問題が発生しないように、開発者は常に標準的な構文を使用することをお勧めします。

 

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

Note

Windows 7 以降では、数値の標準的な構文はありません。 浮動小数点形式はロケールによって異なるため、浮動小数点定数を含む標準クエリの使用はサポートされていません。 対照的に、整数定数は数字のみを使用して記述でき (千単位の区切りなし)、Windows 7 以降の標準クエリで安全に使用できます。

 

次の表は、正規プロパティの例とそれらを使用するための構文を示しています。

正規プロパティの種類 構文
文字列値 System.Author
文字列値は author プロパティで検索されます。
System.Author:Jacobs
列挙範囲 System.Priority 優先度プロパティには数値の範囲を指定できます。
System.Priority:System.Priority#High
Boolean System.IsDeleted
ブール値は任意のブールプロパティで使用できます。
System.IsDeleted:System.StructuredQueryType.Boolean#True、かつ System.IsDeleted:System.StructuredQueryType.Boolean#False
数値 System.Size
浮動小数点の形式はロケールによって異なるため、浮動小数点定数を含む標準クエリを安全に記述することはできません。 整数は千単位の区切り文字なしで記述する必要があります。 次に例を示します。
System.Size:<12345

 

標準プロパティとプロパティ システム全般の詳細については、「システム プロパティ」を参照してください。 または、パブリック ヘッダー ファイルを参照してください。

クエリ演算子

プロパティ p がいくつかの項目に対して複数の値を持つ場合、p:<restr> に対する AQS クエリは、 <restr> が少なくとも 1 つの値に対して true である場合に項目を返します。 (<restr> は制限を表します。)

次の表に示す構文は、演算子、演算子記号、例、および例の説明で構成されています。 演算子と記号はどの言語でも使用でき、どのクエリにも含めることができます。 COP_IMPLICIT または COP_APPLICATION_SPECIFIC 演算子を使用しないでください。 一部の演算子には互換性のある記号があります。

Operator 記号 説明
COP_EQUAL =
System.FileExtension:=".txt"
値は文字列「.txt」です。
COP_NOTEQUAL
-
<>
NOT
- -
System.Kind:≠画像
System.Photo.DateTaken:-[]¹
System.Kind:<>画像
System.Kind:非画像
System.Kind:- -画像
System.Kind プロパティは画像ではありません。
System.Photo.DateTaken プロパティに値があります。
System.Kind プロパティは画像ではありません。
System.Kind プロパティは画像ではありません。
同じプロパティに適用された二重の NOT 演算子は打ち消されません。したがって、System.Kind:- -画像 は、System.Kind:-画像 および System.Kind:非画像と同等です。
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
プロパティ値が文字 non で終わる項目を検索します。
COP_VALUE_CONTAINS ~=
~~
System.Subject.~=round
System.Search.Autosummary:~~round
件名にこの文字列が含まれるメッセージを検索します。たとえば、「ground rules」に一致します。
文字 round を含む自動要約を持つすべての項目を検索します。
COP_VALUE_NOTCONTAINS ~!
System.Author:~!"sanjay"
文字列「sanjay」を含まない著者を検索します。
COP_DOSWILDCARDS ~
System.FileName:~"Mic?osoft W*d"
ファイル名が Micで始まり、その後に何らかの文字が続き、その後に osoft wが続き、その後に dで終わる任意の文字が続くファイルを検索します。
? および * 文字は文字通りには解釈されず、DOS スタイルのワイルドカード文字のように機能します。
  • ? 任意の 1 文字に一致します。
  • * は 0 個以上の任意の文字に一致します。
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 のいずれかです。

クエリ値

クエリ値を制限する方法の便利な例を次の表に示します。

値/シンボル 説明
String auto
検索できる任意の文字列。 文字列には、構文の一部である空白や文字の組み合わせを含めることはできません。 この例では、 auto で始まる単語を検索します。
クォート付き文字列 "" 「結論: 有効」 "「青」チーム"
任意の文字列。 文字列は構文の一部として解釈されません。
引用符は、二重にすればクエリに含めることができます。 この例では、 「青」チームを検索します。
Integer 5678
整数には数字のみを使用してください。 1000の区切り文字を使用しないでください。
浮動小数点数 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
システム日付変更日 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
今日の日付のアイテムを検索します。
翌月の日付のアイテムを検索します。
過去 1 年間の日付を持つアイテムを検索します。

:
AQS は、特定の日付や日付範囲で検索するだけでなく、相対的な日付値 (今日明日来週来月など)、日 (火曜日月曜日..水曜日など)、月 (2 月) も認識します。


.. System.ItemDate:11/05/04..11/10/04 System.Size:5kb..10kb
二重ピリオドは値の範囲を示します。 2004 年 11 月 5 日から 2004 年 11 月 10 日までの日付のアイテムを検索します。
サイズが 5 ~ 10kb のアイテムを検索します。

 

スコープの制限

ユーザーは、検索範囲を特定のフォルダーの場所またはデータ ストアに制限できます。 たとえば、複数の電子メール アカウントを使用しており、クエリを Microsoft Outlook または Microsoft Outlook Express のいずれかに制限する場合は、それぞれ System.Search.Store:mapi または System.Search.Store:oe を使用できます。 次の表は、データ ストアによって検索を制限する方法の例を示しています。

データストアによる検索の制限 Keyword
ファイル file 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を参照してください。

プログラムによるインデックスのクエリ

SQL と AQS のアプローチを使用してインデックスにクエリを実行する

ISearchQueryHelper を使用してインデックスにクエリを実行する

search-ms プロトコルを使用してインデックスにクエリを実行する

Windows Search SQL 構文を使用したインデックスのクエリ