共用方式為


Windows 搜尋服務中的查詢程式

本主題的組織方式如下:

Windows 搜尋服務中的查詢是以下列四種方法為基礎:

  • AQS (進階查詢語法)
  • NQS) (自然查詢語法
  • 結構化查詢語言 (SQL) (Structured Query Language (SQL))
  • 結構化查詢介面

AQS 是 Windows 搜尋服務用來查詢索引及精簡搜尋參數的預設查詢語法。 AQS 主要是面向使用者,而且可由使用者用來建置 AQS 查詢,但也可供開發人員以程式設計方式建置查詢。 在 Windows 7 中引進標準 AQS,而且必須用來以程式設計方式產生 AQS 查詢。 在 Windows 7 和更新版本中,可以根據 AQS 條件是否符合 AQS 條件來提供快捷方式功能表選項。 如需詳細資訊,請參閱 建立操作功能表處理常式中的。 AQS 查詢可以限制為特定類型的檔案,稱為檔案種類。 如需詳細資訊,請參閱 檔案類型和關聯。 如需相關屬性的參考檔,請參閱 System.KindSystem.KindText

NQS 是比 AQS 更寬鬆的查詢語法,類似于人類語言。 如果已選取 NQS 而非預設值 AQS,Windows 搜尋就可以使用 NQS 來查詢索引。

SQL 是定義查詢的文字語言。 SQL 在許多不同的資料庫技術之間很常見。 Windows 搜尋會使用 SQL、實作它的子集,並藉由將元素新增至語言來擴充它。 Windows 搜尋 SQL 擴充標準 SQL-92 和 SQL-99 資料庫查詢語法,以增強其文字型搜尋的實用性。 Windows 搜尋 SQL 的所有功能都與 Windows XP 和 Windows Server 2003 及更新版本的 Windows 搜尋相容。 如需 Windows 搜尋 SQL 的詳細資訊,請參閱 使用 Windows 搜尋 SQL 語法查詢索引,以及 Windows 搜尋 SQL 語法概觀

本主題稍後會說明結構化查詢 API。 如需結構化查詢 API 的參考檔,請參閱 查詢介面 ISearchQueryHelper之類的介面可協助從一組輸入值建構 SQL 字串。 此介面會將 AQS 使用者查詢轉換成 Windows 搜尋 SQL,並指定可在 SQL 中表示但不能以 AQS 表示的查詢限制。 ISearchQueryHelper 也會取得 OLE DB 連接字串,以連線到 Windows 搜尋服務資料庫。

本機和遠端查詢

您可以在本機或遠端執行查詢。 使用 FROM 子句 的本機查詢會顯示在下列範例中。 本機查詢只會查詢本機 SystemIndex 目錄。

FROM SystemIndex

下列範例顯示使用 FROM 子句 的遠端查詢。 新增 ComputerName 會將上述範例轉換成遠端查詢。

FROM [<ComputerName>.]SystemIndex

根據預設,Windows XP 和 Windows Server 2003 未安裝 Windows 搜尋。 只有 Windows 搜尋 4 (WS4) 提供遠端查詢支援。 舊版 Windows 桌面搜尋 (WDS) ,例如 3.01 和更早版本,不支援遠端查詢。 使用 Windows 檔案總管,您可以查詢遠端電腦的本機索引,以取得檔案系統專案, (「file:」 通訊協定所處理的專案) 。

若要依遠端查詢擷取專案,專案必須符合下列需求:

  • 可透過通用命名慣例 (UNC) 路徑來存取。
  • 存在於用戶端可存取的遠端電腦上。
  • 將其安全性設定為允許用戶端具有讀取權限。

Windows 檔案總管具有共用專案的功能,包括網路 和共用中心內的「公用」共用 (\\Machine\Public\...) ,以及透過共用精靈共用之專案的「使用者」共用 (\\Machine\Users\...) 。 在共用資料夾 () 之後,您可以在 FROM 子句中指定遠端電腦的電腦名稱稱,以及在 SCOPE 子句中指定遠端電腦上的 UNC 路徑,以查詢本機索引。 下列範例顯示使用 FROM 和 SCOPE 子句的遠端查詢。

SELECT System.ItemName FROM MachineName.SystemIndex WHERE SCOPE='file://MachineName/<path>' 

此處提供的範例會使用 SQL。

結構化查詢 API 概觀

結構化查詢可讓您透過透過個別屬性的查詢布林值組合來搜尋資訊。 在本主題中,我們將概述最重要的結構化查詢 API 和方法的功能。 如需結構化查詢 API 的參考檔,請參閱 查詢介面

IQueryParser

IQueryParser::P arse方法會剖析使用者輸入字串,並以IQuerySolution的形式產生解譯。 如果該方法的 pCustomProperties 參數不是 null,則它是 IRichChunk 物件的列舉, (每個辨識的自訂屬性) 一個。 其他 IQueryParser 方法可讓應用程式設定數個選項,例如地區設定、架構、斷詞工具,以及各種具名實體類型的處理常式。 IQueryParser::GetSchemaProvider 會傳回 ISchemaProvider 介面,以流覽載入的架構。

IQuerySolution :IConditionFactory

IQuerySolution介面會提供剖析輸入字串結果的所有資訊。 因為 IQuerySolution 也是 IConditionFactory 介面,所以可以建立其他條件樹狀節點。 IQuerySolution::GetQuery方法會產生解譯的條件樹狀結構。 IQuerySolution::GetQuery 也會傳回語意類型。

IConditionFactory

IConditionFactory 會建立條件樹狀節點。 如果IConditionFactory::MakeNot簡化參數VARIANT_TRUE,則產生的ICondition會簡化,而且不需要是負節點。 如果IConditionFactory::MakeAndOrpSubConditions參數不是 Null,則該參數應該是ICondition物件的列舉,並變成子樹狀結構。IConditionFactory::MakeLeaf會建構具有指定屬性名稱、作業和值的分葉節點。 pValueType參數中的字串應該是架構中語意類型的名稱。 如果 expand 參數 VARIANT_TRUE 且屬性是虛擬的,則產生的條件樹狀結構通常是從將屬性展開至其已定義組成元素所產生的分離。 如果不是 Null, pPropertyNameTermpOperatorTermpValueTerm 參數應該識別指出屬性、作業和值的詞彙。

ICondition:IPersistStream

ICondition介面是條件樹狀結構中的單一節點。 節點可以是負節點、AND 節點、OR 節點或分葉節點。 針對非分葉節點 ICondition::GetSubConditions ,會傳回子樹的列舉。 對於分葉節點, ICondition 的下列方法會傳回下列值:

IRichChunk

每個 IRichChunk 物件都會識別權杖範圍和字串。 IRichChunk 是公用程式介面,代表範圍的相關資訊 (通常是由起始位置和長度所識別的權杖範圍) 。 此範圍資訊包括字串和/或 VARIANT

IConditionGenerator

IConditionGenerator介面是由應用程式提供,以處理具名實體類型的辨識和條件樹狀結構產生。 條件產生器會透過IQueryParser::SetMultiOption提供給IQueryParser IQueryParser會針對目前載入的架構,使用ISchemaProvider呼叫IConditionGenerator::Initialize。 這樣做可讓 IConditionGenerator 取得所需的任何架構資訊。 剖析輸入字串時,IQueryParser會呼叫每個IConditionGenerator 的 IConditionGenerator::RecognizeNamedEntities方法,以便報告在輸入字串中辨識的具名實體出現次數。 IQueryParser 可以使用目前的地區設定,而且應該使用輸入的權杖化,因為它需要報告任何具名實體的權杖範圍。

IQueryParser 即將發出分葉節點,而值的語意類型與 IConditionGenerator的具名實體類型相符時, IQueryParser 會呼叫 IConditionGenerator::GenerateforLeaf ,其中包含要產生之節點的資訊。 如果 IConditionGenerator 傳回S_OK,它應該會傳回條件樹狀結構 (,這不需要是分葉節點) ,並通知 IQueryPars 是否 隱藏通常會產生為預防措施的替代字串解譯。

ITokenCollection

ITokenCollection::NumberOfTokens方法會傳回權杖數目。ITokenCollection::GetToken會傳回第 i個權杖的相關資訊。 開頭和長度是輸入字串中的字元位置。 只有在有文字覆寫輸入字串中的字元時,傳回的文字才會是非 Null。 例如,當該破折號在內容中應解譯為負值時,使用 NOT 覆寫輸入字串中的虛線。

INamedEntityCollector

IConditionGenerator 會針對所辨識的每個具名實體呼叫 INamedEntityCollector::Add 。 範圍是權杖範圍。 它必須一律是 beginSpan 的案例? beginActual<endActualendSpanbeginSpanendSpan 可能與 beginActualendActual 不同,如果具名實體開始和/或以語意不重要的標記結尾,例如,仍由具名實體所涵蓋的引號 () 。 此值必須以字串表示,且後續會出現在 IConditionGenerator::GenerateForLeaf的呼叫中。

ISchemaProvider

ISchemaProvider介面可用來流覽實體 (類型的載入架構,) 和關聯 (屬性) 。 以下是個別方法的功能:

IEntity

IEntity介面是一個架構實體,代表具有名稱的類型、與其他類型有一些具名關聯性, (屬性) ,以及衍生自基底實體。 以下是其個別方法的用途:

IRelationship

IRelationship介面代表兩個實體之間的關聯性:來源和目的地。 以下是個別方法的功能:

  • IRelationship::IsReal 會報告關聯性是否為實際。 例如,如果實體 A 衍生自實體 B,並從中繼承名為 R 的關聯性,A 可能仍然有自己的名為 R 的關聯性。不過,關聯性 beween A 和 R 必須具有與 B 相同的目的地類型,而且唯一存在的原因就是儲存 B 特有的中繼資料。這類 B 關聯性稱為「不」實際。
  • IRelationship::Medadata 會傳回 IMetaData 介面的列舉,此實體的每個中繼資料組各一個。
  • IRelationship::D efaultPhrase 會傳回要用於重新整理中此關聯性的預設片語。 每個關聯性都有一個預設片語,表示它有助於產生條件樹狀結構的 AQS 或 NQS 重新整理。

IMetaData

中繼資料是與實體、關聯性或整個架構相關聯的索引鍵/值組。 因為索引鍵不一定是唯一的,所以可以將元資料集合視為多重對應。 系統會呼叫 IMetaData::GetData 來擷取中繼資料組的索引鍵和值。

查詢案例

下列案例描述在常見的查詢案例中,在 Windows 搜尋服務中使用結構化查詢 API,例如建立條件樹狀結構及查詢索引。

條件擷取和查詢剖析

建立查詢時,其範圍是透過告知系統搜尋位置來定義。 這會限制搜尋結果。 定義範圍之後,會套用篩選,並傳回篩選集。 搜尋結果受限於建置具有分葉節點的條件樹狀結構,類似于圖形。 接著會擷取這些條件。 條件樹狀結構是一種布林值組合, (AND、OR、NOT) 分葉條件,其中每個條件都會透過作業將屬性與值產生關聯。 分葉節點代表透過某些作業對值之單一屬性的限制。

篩選限制需要描述限制的邏輯運算式。 定義此運算式的開頭是 ICondition 介面,用來在條件樹狀結構中建立單一節點。 因為下列範例中只有一個條件,所以樹狀結構不會變更。

    
    [
        object,
        uuid(0FC988D4-C935-4b97-A973-46282EA175C8),
        pointer_default(unique)
    ]
    interface ICondition : IPersistStream
    {
        HRESULT GetConditionType([out, retval] CONDITION_TYPE* pNodeType);
        HRESULT GetSubConditions([in] REFIID riid, [out, retval, iid_is(riid)] void** ppv);
        [local] HRESULT GetComparisonInfo([out, annotation("__deref_opt_out")] LPWSTR *ppszPropertyName, [out, annotation("__out_opt")] CONDITION_OPERATION *pOperation, [out, annotation("__out_opt")] PROPVARIANT *pValue);
        HRESULT GetValueType([out, retval] LPWSTR* ppszValueTypeName);
        HRESULT GetValueNormalization([out, retval] LPWSTR* ppszNormalization);
        [local] HRESULT GetInputTerms([out, annotation("__out_opt")] IRichChunk** ppPropertyTerm, [out, annotation("__out_opt")] IRichChunk** ppOperationTerm, [out, annotation("__out_opt")] IRichChunk** ppValueTerm);
        HRESULT Clone([out, retval] ICondition** ppc);
    };


如果有一個以上的篩選準則,則會使用 AND 和其他布林運算子來達成單一樹狀結構。 AND-trees 和 OR-trees 代表其子樹的結合和分離。 NOT 樹狀結構代表其單一子樹的否定。 AQS 提供文字方法來使用布林運算子達成邏輯運算式,而且通常更簡單。

在下一個範例中,我們會將條件樹狀結構 (ICondition) 轉換成視覺化形式。 使用 IQueryParser 介面的查詢剖析器會將 ICondition 轉換成 RTF) 查詢字串的 RTF (格式 RTF。 IQueryParser::RestateToString方法會傳回查詢文字,而IQueryParser::P arse方法會產生IQuerySolution介面。 下列範例示範如何執行所有動作。

    [
        object,
        uuid(2EBDEE67-3505-43f8-9946-EA44ABC8E5B0),
        pointer_default(unique)
    ]
    interface IQueryParser : IUnknown
    {
        HRESULT Parse([in] LPCWSTR pszInputString, [in] IEnumUnknown* pCustomProperties, [out, retval] IQuerySolution** ppSolution);
        HRESULT SetOption([in] STRUCTURED_QUERY_SINGLE_OPTION option, [in] PROPVARIANT const* pOptionValue);
        HRESULT GetOption([in] STRUCTURED_QUERY_SINGLE_OPTION option, [out, retval] PROPVARIANT* pOptionValue);
        HRESULT SetMultiOption([in] STRUCTURED_QUERY_MULTIOPTION option, [in] LPCWSTR pszOptionKey, [in] PROPVARIANT const* pOptionValue);
        HRESULT GetSchemaProvider([out, retval] ISchemaProvider** ppSchemaProvider);
        HRESULT RestateToString([in] ICondition* pCondition, [in] BOOL fUseEnglish, [out] LPWSTR* ppszQueryString);
        HRESULT ParsePropertyValue([in] LPCWSTR pszPropertyName, [in] LPCWSTR pszInputString, [out, retval] IQuerySolution** ppSolution);
        HRESULT RestatePropertyValueToString([in] ICondition* pCondition, [in] BOOL fUseEnglish, [out] LPWSTR* ppszPropertyName, [out] LPWSTR* ppszQueryString);
    };

IQueryParser::P arse的主要輸入是要剖析的使用者輸入字串,但應用程式也可以通知查詢剖析器它從應用程式特定語法 (中所辨識的任何屬性) 。 IQueryParser::P arse的輸出是IQuerySolution,可提供與剖析調用相關的所有資訊。 有方法可以取得輸入字串、輸入字串如何標記化、任何剖析錯誤,以及剖析的查詢作為條件樹狀結構,以 ICondition表示。 下列範例顯示 ...

    [
        object,
        uuid(D6EBC66B-8921-4193-AFDD-A1789FB7FF57),
        pointer_default(unique)
    ]
    interface IQuerySolution : IConditionFactory
    {
        [local] HRESULT GetQuery([out, annotation("__out_opt")] ICondition** ppQueryNode, [out, annotation("__out_opt")] IEntity** ppMainType);
        HRESULT GetErrors([in] REFIID riid, [out, retval, iid_is(riid)] void** ppParseErrors);
        [local] HRESULT GetLexicalData([out, annotation("__deref_opt_out")] LPWSTR* ppszInputString, [out, annotation("__out_opt")] ITokenCollection** ppTokens, [out, annotation("__out_opt")] LCID* pLocale, [out, annotation("__out_opt")] IUnknown** ppWordBreaker);
    }    

    

在上述範例中, IQuerySolution::GetQuery 可以取得查詢的任何資訊,包括原始文字、組成文字的標記或條件樹狀結構。 下表列出可能傳回的查詢值的範例。

傳回查詢值的範例 Description
author:relja OR author:tyler IQueryParser::RestateToString傳回的查詢文字
?author?, ?:?, ?relja?, ?OR?, ?author?, ?:?, ?tyler? 權杖的細分
未解析的條件樹狀結構 未解析的條件樹狀結構

 

傳回的初始條件樹狀結構無法解析。 在未解析的條件樹狀結構中,日期和時間參考,例如 date:yesterday 不會轉換成絕對時間。 此外,不會展開虛擬屬性。 虛擬屬性是做為多個屬性匯總的屬性。

例如,查詢 kind:email from:reljai 會產生下列未解析和已解析的條件樹狀結構。 未解析的條件樹狀結構位於左側,而已解析的條件樹狀結構則位於右側。

未解析和已解析的條件樹狀結構

呼叫 IConditionFactory::Resolve即可取得已解析的樹狀結構。 不過,傳遞 SQRO_DONT_RESOLVE_DATETIME 讓日期和時間無法解決。 無法解析的條件樹狀結構有一個優點,因為未解析的條件樹狀結構包含查詢的相關資訊。 每個分葉節點都會指向 IQuerySolution::GetLexicalData所傳回的權杖,此權杖會對應至使用 IRichChunk 介面時的屬性、運算子和值。 下列範例顯示 ...

    interface ITokenCollection : IUnknown
    {
        HRESULT NumberOfTokens(ULONG* pCount);
        HRESULT GetToken([in] ULONG i, [out, annotation("__out_opt")] ULONG* pBegin, [out, annotation("__out_opt")] ULONG* pLength, [out, annotation("__deref_opt_out")] LPWSTR* ppsz);
    };

ICondition:: GetInputTerms([out, annotation("__out_opt")] 
IRichChunk** ppPropertyTerm, [out, annotation("__out_opt")] 
IRichChunk** ppOperationTerm, [out, annotation("__out_opt")] 
IRichChunk** ppValueTerm);

    interface IRichChunk : IUnknown
    {
        HRESULT GetData([out, annotation("__out_opt")] ULONG* pFirstPos, [out, annotation("__out_opt")] ULONG* pLength, [out, annotation("__deref_opt_out")] LPWSTR* ppsz, [out, annotation("__out_opt")] PROPVARIANT* pValue);
    }

查詢索引

有數種方法可以查詢索引。 有些是以 SQL 為基礎,有些則是以 AQS 為基礎。 您也可以使用 查詢介面,以程式設計方式查詢 Windows 搜尋服務索引。 查詢索引的特定介面有三個: ISearchQueryHelperIRowsetPrioritizationIRowsetEvents。 如需概念資訊,請參閱 以程式設計方式查詢索引

您可以使用 ISearchQueryHelper 介面來開發元件或協助程式類別來查詢索引。 這個介面會實作為 ISearchCatalogManager (和 ISearchCatalogManager2) 的協助程式類別,並呼叫 ISearchCatalogManager::GetQueryHelper來取得。 如需概念資訊,請參閱 使用 ISearchQueryHelper 查詢索引

ISearchQueryHelper 可讓您:

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

Windows 7 和更新版本支援索引優先順序和資料列集事件。 使用 IRowsetPrioritization時,有一個優先順序堆疊可讓用戶端要求特定查詢中使用的範圍高於一般優先順序。 IRowsetEvents 會提供資料列集中專案的變更通知,包括新增專案、刪除專案,以及修改專案資料。 使用資料列集事件通知可確保常設查詢的結果盡可能為最新狀態。 如需概念資訊,請參閱 在 Windows 7 中編制優先順序和資料列集事件的索引

Windows 搜尋服務中的索引、查詢和通知

索引中包含的內容

Windows 搜尋中的索引編制程式

Windows 搜尋中的通知程式

URL 格式設定需求