Share via


使用 ISearchQueryHelper 查詢索引

您可以使用 ISearchQueryHelper 介面來查詢索引。 這個介面會實作為 ISearchCatalogManager (和 ISearchCatalogManager2) 的協助程式類別,並呼叫 ISearchCatalogManager::GetQueryHelper來取得。 此介面可讓您:

  • 取得 OLE DB 連接字串以連線到 Windows 搜尋服務資料庫。
  • 將進階查詢語法 (AQS) 使用者查詢轉換成 Windows 搜尋服務結構化查詢語言 (SQL) (SQL) 。
  • 指定可在 SQL 中表示但無法在 AQS 中表示的查詢限制。

本主題的組織方式如下:

使用 ISearchQueryHelper 消費者入門

您應該注意幾個重要介面和方法,才能開始使用 ISearchQueryHelper 介面以程式設計方式查詢 Windows 搜尋。 概括而言,您必須遵循下列步驟:

  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 搜尋的系統目錄名稱為 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 搜尋服務索引 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 搜尋的 OLE DB 提供者。 此方法會轉譯 AQS) (進 階查詢語法 或自然查詢語法, (使用者輸入的 NQS) 查詢,並讓您視需要新增其他 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"

注意

方法會產生 FREETEXT 和 CONTAINS 述詞,因為 CONTAINS 單獨不會產生有意義的排名。

 

使用地區設定識別碼

方法 Description
ISearchQueryHelper::get_QueryContentLocale/
ISearchQueryHelper::p ut_QueryContentLocale
取得/放置語言代碼識別碼 (LCID) 查詢。 這有助於取得正確的斷詞工具和字幹分析器,以比較查詢字詞與目錄/反向索引。 預設值為目前的輸入地區設定。
ISearchQueryHelper::get_QueryKeywordLocale/
ISearchQueryHelper::p ut_QueryKeywordLocale
取得/放置語言的 LCID,當剖析進階查詢語法 (AQS) 關鍵字時使用。 預設值為預設使用者地區設定。

 

內容地區設定和關鍵字地區設定是 (LCID) 的地區設定識別碼,可藉由識別查詢字詞的語言和 AQS 關鍵字的語言,協助搜尋引擎使用正確的斷詞工具。 這些不一定是相同的 LCID,因為 Windows 搜尋提供許多國際版本,也包含多語系使用者介面 (MUI) 套件。 內容地區設定會識別使用者輸入搜尋查詢的語言 LCID,而關鍵字地區設定會識別搜尋引擎在剖析進階查詢語法 (AQS) 關鍵字時所使用的 LCID。

例如,如果您有不含 MUI 套件的英文-US 版本,則內容地區設定和關鍵字地區設定都是 1033。 如果您有不含 MUI 套件的德文版本,則內容地區設定和關鍵字地區設定都是 1031 (gr-gr) 。 不過,如果您有英文版的羅馬尼亞文 MUI 套件,則內容地區設定為 2072 (ro) ,關鍵字地區設定為 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 的相關資訊。

使用這些方法,您可以使用逗號分隔、以 Null 結尾的 Unicode 字串來存取或修改屬性存放區:「System.Document.Author, System.Document.Title」 的一或多個資料行名稱。

使用查詢字詞展開

方法 描述
ISearchQueryHelper::get_QueryTermExpansion
ISearchQueryHelper::p ut_QueryTermExpansion
取得/設定搜尋字詞展開旗標。

 

這個方法可讓您使用萬用字元擴充某些查詢詞彙,類似于正則運算式展開。 前置詞展開會搜尋具有相同前置詞的字組, (漏斗圖) 。 如果未設定,則會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 搜尋服務 SQL 語法查詢索引

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