ISearchQueryHelper を使用したインデックスのクエリ

ISearchQueryHelper インターフェイスを使用して、インデックスに対してクエリを実行できます。 このインターフェイスは ISearchCatalogManager (および ISearchCatalogManager2) のヘルパー クラスとして実装され、ISearchCatalogManager::GetQueryHelper を呼び出すことによって取得されます。 このインターフェイスを使用すると、次の操作を実行できます。

  • Windows Search データベースに接続するための OLE DB 接続文字列を取得します。
  • 高度なクエリ構文 (AQS) ユーザー クエリを Windows Search 構造化照会言語 (SQL) に変換します。
  • SQL では表現できますが、AQS では表現できないクエリ制限を指定します。

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

ISearchQueryHelper を使用したはじめに

ISearchQueryHelper インターフェイスを使用してプログラムで Windows Search のクエリを開始する前に、いくつかの重要なインターフェイスとメソッドに注意する必要があります。 大まかに言うと、次の手順に従う必要があります。

  1. ISearchManager インスタンスをインスタンス化します。

    // Create ISearchManager instance
    ISearchManager* pSearchManager;
    
    // Use library SearchSDK.lib for CLSID_CSearchManager.
    hr = CoCreateInstance(CLSID_CSearchManager, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pSearchManager));      
    
  2. ISearchManager::GetCatalog を使用して ISearchCatalogManager のインスタンスを取得します。 Windows Search のシステム カタログの名前は です SYSTEMINDEX

    // Create ISearchCatalogManager instance 
    ISearchCatalogManager* pSearchCatalogManager;
    
    // Call ISearchManager::GetCatalog for "SystemIndex" to access the catalog to the ISearchCatalogManager
    hr = pSearchManager->GetCatalog(L"SystemIndex", &pSearchCatalogManager);
    
    
  3. ISearchCatalogManager::GetQueryHelper を使用して ISearchQueryHelper のインスタンスを取得します。

    // Call ISearchCatalogManager::GetQueryHelper to get the ISearchQueryHelper interface
    ISearchQueryHelper* pQueryHelper;
    
    hr = pSearchCatalogManager->GetQueryHelper(&pQueryHelper);
    
    
  4. ISearchQueryHelper のインスタンスを作成したら、Windows Search インデックス OLE DB コネクタへの接続に使用される接続文字列を取得できます。

    // Call get_ConnectionString to get the OLE DB connection string
    LPWSTR pszConnectionString=NULL;
    
    hr = pQueryHelper->get_ConnectionString(&pszConnectionString);
    // NOTE: YOU MUST call CoTaskMemFree() on the string
    
    

GenerateSqlFromUserQuery メソッドの使用

ISearchQueryHelper::GenerateSQLFromUserQuery メソッドは、ユーザー入力を SQL クエリ文字列に変換し、WINDOWS Search 用 OLE DB プロバイダーに送信できます。 このメソッドは、ユーザーが入力した 高度なクエリ構文 (AQS) または自然クエリ構文 (NQS) クエリを SQL に変換し、必要に応じて他の SQL フラグメントを追加できます。

SQL クエリ文字列は、次の形式で返されます。

SELECT <QuerySelectColumns> 
FROM <CatalogName that created query helper>
WHERE <Result of interpreting the user query passed into this function according to QuerySyntax>
      [ AND|OR <QueryWhereRestrictions> ]
    

呼び出し GenerateSQLFromUserQuery("comput")から返される SQL 文字列の例を次に示します。

SELECT "System.ItemUrl" 
FROM "SystemIndex" 
WHERE ((CONTAINS(*,'"comput*"',1033) RANK BY COERCION(Absolute, 1)) OR 
       (FREETEXT(("System.ItemNameDisplay":0.9, *:0.1), 'comput', 1033) AND CONTAINS(*,'"comput"',1033)))
ORDER BY "System.ItemUrl"

Note

CONTAINS だけでは意味のあるランク付けが生成されないため、このメソッドは FREETEXT 述語と CONTAINS 述語の両方を生成します。

 

ロケール識別子の操作

メソッド 説明
ISearchQueryHelper::get_QueryContentLocale/
ISearchQueryHelper::p ut_QueryContentLocale
クエリの言語コード識別子 (LCID) を取得または設定します。 これにより、正しいワードブレーカーとステミング機能を使用して、クエリ用語とカタログ/逆インデックスを比較できます。 既定値は現在の入力ロケールです。
ISearchQueryHelper::get_QueryKeywordLocale/
ISearchQueryHelper::p ut_QueryKeywordLocale
高度なクエリ構文 (AQS) キーワードを解析するときに使用する言語の LCID を取得または設定します。 既定値は既定のユーザー ロケールです。

 

コンテンツ ロケールキーワード (keyword) ロケールは、検索エンジンがクエリ用語の言語と AQS キーワードの言語を識別することによって正しいワード ブレーカーを使用するのに役立つロケール識別子 (LCID) です。 Windows Search は多くの国際バージョンで提供されており、より多くの言語用の多言語ユーザー インターフェイス (MUI) パックも含まれているため、これらは常に同じ LCID とは限りません。 コンテンツ ロケールは、ユーザーが検索クエリを入力する言語の LCID を識別します。一方、キーワード (keyword) ロケールは、高度なクエリ構文 (AQS) キーワードを解析するときに検索エンジンが使用する LCID を識別します。

たとえば、MUI パックのない英語と米国のバージョンがある場合、コンテンツ ロケールとキーワード (keyword)ロケールの両方が 1033 になります。 MUI パックのないドイツ語バージョンがある場合、コンテンツ ロケールとキーワード (keyword)ロケールの両方が 1031 (gr-gr) になります。 ただし、ルーマニアのMUIパックで英語版を使用している場合、コンテンツロケールは2072(ro)、キーワード (keyword)ロケールは1033(en-us)です。

プロパティと列の操作

メソッド 説明
ISearchQueryHelper::get_QueryContentProperties/
ISearchQueryHelper::p ut_QueryContentProperties
検索のコンテンツ プロパティ (CONTAINS 句または FREETEXT 句にリストされているプロパティ列) を取得または設定します。
ISearchQueryHelper::get_QuerySelectColumns/
ISearchQueryHelper::p ut_QuerySelectColumns
SELECT ステートメントで要求された列 (またはプロパティ) を取得または設定します。 既定値は System.ItemUrl で、WHERE 句で使用されるプロパティです。

 

アイテムは、プロパティ ストアで行として表されます。 各行には、そのアイテムのプロパティを表す列が多数含まれています。 すべてのアイテムに特定のプロパティの値が含まれるわけではありません。 たとえば、オーディオ ファイルには通常、System.Property.FromName プロパティの値は含まれませんが、System.Music.Artist に関する情報が含まれている場合があります。

これらのメソッドを使用すると、プロパティ ストアの 1 つ以上の列名 "System.Document.Author, System.Document.Title" を指定する、コンマ区切りの null で終わる Unicode 文字列でプロパティにアクセスまたは変更します。

クエリ用語の展開の操作

メソッド 説明
ISearchQueryHelper::get_QueryTermExpansion
ISearchQueryHelper::p ut_QueryTermExpansion
検索用語拡張フラグを取得または設定します。

 

このメソッドを使用すると、正規表現の展開と同様に、野生のカード文字を使用して一部のクエリ用語を拡張できます。 プレフィックス展開では、同じプレフィックス (fun/funnel) を持つ単語が検索されます。 設定されていない場合、既定値はSEARCH_TERM_PREFIX_ALL。 SEARCH_TERM_EXPANSION列挙体でサポートされている値は次のとおりです。

  • SEARCH_TERM_PREFIX_ALL - すべての検索語句が展開されます
  • SEARCH_TERM_NO_EXPANSION - 検索語句が展開されない

その他の ISearchQueryHelper メソッドの操作

ISearchQueryHelper インターフェイスのメソッドの多くは、クエリ引数を設定したり、返されるプロパティを定義したりするために使用されます。

メソッド 説明
ISearchQueryHelper::get_ConnectionString
OLE DB 接続文字列を返します。 これは、適切に書式設定された正しい接続文字列を取得するための推奨される方法です。
ISearchQueryHelper::get_QueryMaxResults
ISearchQueryHelper::p ut_QueryMaxResults
クエリによって返される結果の最大数 (つまり SELECT TOP n) を取得/設定します。 既定値は -1 です。つまり、最大の結果句は生成されません。
ISearchQueryHelper::get_QuerySorting
ISearchQueryHelper::p ut_QuerySorting
クエリ結果セット (ORDER BY) の並べ替え順序を取得または設定します。 ORDER BY 句が存在しない場合、結果は非決定論的な順序で返されます。
ISearchQueryHelper::get_QuerySyntax
ISearchQueryHelper::p ut_QuerySyntax
クエリの構文 (高度なクエリ構文または自然なクエリ構文) を取得または設定します。
ISearchQueryHelper::get_QueryWhereRestrictions
ISearchQueryHelper::p ut_QueryWhereRestrictions
WHERE 句を使用して追加される制限を取得または設定します。

 

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

SQL と AQS のアプローチを使用したインデックスのクエリ

search-ms プロトコルを使用したインデックスのクエリ

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

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