共用方式為


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

有數種方式可以使用 Windows 搜尋來查詢索引。 本主題概述進階查詢語法 (AQS) 和以 結構化查詢語言 (SQL) (SQL) 為基礎的方法。

本主題的組織方式如下:

SQL 型查詢

SQL 是定義查詢的文字語言。 SQL 在許多不同的資料庫技術中很常見。 Windows 搜尋會使用 SQL、實作它的子集,並將元素新增至語言來擴充它。 Windows 搜尋所使用的 Windows 搜尋 SQL 會擴充標準 SQL-92 和 SQL-99 資料庫查詢語法的一部分,以增強其在文字型搜尋中的實用性。 Windows Search SQL 的所有功能都與 Windows XP 和 Windows Server 2003 及更新版本的 Windows 搜尋相容。

如需使用 Windows 搜尋 SQL 語法的詳細資訊,請參閱使用 Windows 搜尋 SQL 語法查詢索引和 Windows 搜尋 SQL 語法概觀。

下列查詢索引的方法是以 SQL 為基礎。

使用 OLE DB

對象連結和內嵌資料庫 (OLE DB) 是元件物件模型 (COM) API,可讓您統一存取不同類型的數據存放區,包括電子表格之類的非關係資料庫。 OLE DB 會將資料存放區與透過包含Shell資料源、工作階段、命令和資料列集的一組抽象概念來存取它的應用程式分開。 OLE DB 提供者是一種軟體元件,可實作 OLE DB 介面,以便從特定資料存放區將數據提供給應用程式。

您可以使用 C# 中的 OleDbConnection 和 OleDbSession 物件,並使用 C++ 內建在 Active Template Library (ATL) 中的 OLE DB 支援,以程式設計方式存取 Windows Search OLE DB 提供者(透過 atlclidb.h)。 唯一必須設定的屬性是提供者字串。

您可以使用下列字串:

provider=Search.CollatorDSO;EXTENDED PROPERTIES="Application=Windows"

或者,您可以呼叫 ISearchQueryHelper::get_ConnectionString 來取得 連接字串 如需範例,請參閱使用 ISearchQueryHelper

注意

Windows Search OLE DB 提供者是唯讀的,並支援 SELECT 和 GROUP ON 語句。 不支援 INSERT 和 DELETE 語句。

#include <atldbcli.h>
CDataSource cDataSource;
hr = cDataSource.OpenFromInitializationString(L"provider=Search.CollatorDSO.1;EXTENDED PROPERTIES=\"Application=Windows\"");

if (SUCCEEDED(hr))
{
    CSession cSession;
    hr = cSession.Open(cDataSource);

    if (SUCCEEDED(hr))
    {
        CCommand<CDynamicAccessor, CRowset> cCommand;
        hr = cCommand.Open(cSession, pszSQL);

        if (SUCCEEDED(hr))
        {
            for (hr = cCommand.MoveFirst(); S_OK == hr; hr = cCommand.MoveNext())
            {
                for (DBORDINAL i = 1; i <= cCommand.GetColumnCount(); i++)
                {
                    PCWSTR pszName = cCommand.GetColumnName(i);
                    // do something with the column here
                }
            }
            cCommand.Close();
        }
    }
}

如需 OLE DB 的詳細資訊,請參閱 OLE DB 程式設計概觀。 如需 .NET Framework Data Provider for OLE DB 的詳細資訊,請參閱 System.Data.OleDb 命名空間 檔。

使用 ADO 和 ADO.NET

Microsoft ActiveX Data Objects (ADO) 和 ADO.NET 可讓您撰寫用戶端應用程式,以透過提供者存取及操作資料庫伺服器中的數據。 Windows 搜尋是唯讀技術:您可以使用桌面搜尋來擷取數據,但無法使用 Windows 搜尋來變更數據。 不過,您可以將搜尋的結果傳遞至可變更數據的技術。

下列程式代碼範例示範如何開啟數據源的連線、使用 Windows Search SQL SELECT 語句建立和開啟 RecordSet,以及從索引取得五個最大檔案的 URL。

注意

如需如何取得 連接字串 的資訊,請參閱使用 ISearchQueryHelper 查詢索引和 ISearchQueryHelper::get_Connection String。

ADO 和 VBScript

'To run this snippet, save it to a file and run it using cscript.exe from a command line.
'Running the .vbs file with Windows Script Host may cause dialog boxes to open for each item returned from the index.

On Error Resume Next

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"

objRecordSet.Open "SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX WHERE scope='file:' ORDER BY System.Size DESC", objConnection

objRecordSet.MoveFirst
Do Until objRecordset.EOF
    Wscript.Echo objRecordset.Fields.Item("System.ItemPathDisplay")
    objRecordset.MoveNext
Loop

ADO 和C++

#import "msado15.dll" rename_namespace("ADO") rename("EOF", "EndOfFile") implementation_only

ADO::_ConnectionPtr connection = NULL;
HRESULT hr = connection.CreateInstance(__uuidof(ADO::Connection));
if (SUCCEEDED(hr))
{
    ADO::_RecordsetPtr recordset = NULL;
    hr = recordset.CreateInstance(__uuidof(ADO::Recordset));
    if (SUCCEEDED(hr))
    {
        connection->CursorLocation = ADO::adUseClient;
        hr = connection->Open(L"Provider=Search.CollatorDSO;Extended Properties='Application=Windows';",
            L"", L"", ADO::adConnectUnspecified);
        if (SUCCEEDED(hr))
        {
            hr = recordset->Open("SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX WHERE scope='file:' ORDER BY System.Size DESC",
            connection.GetInterfacePtr(), ADO::adOpenForwardOnly, ADO::adLockReadOnly, ADO::adCmdText);
            if (SUCCEEDED(hr))
            {
                while (!recordset->EndOfFile)
                {
                    _variant_t var;
                    var = recordset->Fields->GetItem(L"System.ItemPathDisplay")->GetValue();
                    std::cout << static_cast<char *>(_bstr_t(var.bstrVal)) << std::endl;
                    recordset->MoveNext();
                };
                recordset->Close();
            }
            connection->Close();
        }
    }
}

ADO 和 VisualBasic

首先在專案中新增 ADODB 的參考

Dim con As ADODB.Connection
Dim rst As ADODB.Recordset

con = New ADODB.Connection
rst = New ADODB.Recordset

Dim sConString As String
Dim sSQLString As String

sConString = "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
con.Open(sConString)

sSQLString = "SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX
                WHERE scope='file:'
                ORDER BY System.Size DESC"

rst = con.Execute(sSQLString)

Do Until (rst.EOF)
    Print(1, rst("System.ItemPathDisplay").Value)
    rst.MoveNext
Loop

rst.Close
rst = Nothing

con.Close
con = Nothing

ADO.NET 和 C#

string query = @"SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX
                WHERE scope='file:'
                ORDER BY System.Size DESC";

using (OleDbConnection objConnection =
    new OleDbConnection
    ("Provider=Search.CollatorDSO.1;Extended?Properties='Application=Windows';"))
{
    objConnection.Open();
    OleDbCommand cmd = new OleDbCommand(query, objConnection);
    using (OleDbDataReader rdr = cmd.ExecuteReader())
    {
        for (int i = 0; i < rdr.FieldCount; i++)
        {
            Console.Write(rdr.GetName(i));
            Console.Write('\t');
        }
        while (rdr.Read())
        {
            Console.WriteLine();
            for (int i = 0; i < rdr.FieldCount; i++)
            {
                Console.Write(rdr[i]);
                Console.Write('\t');
            }
        }
        Console.ReadKey();
    }
}

在本機和遠端查詢中使用 SQL

您可以在本機或遠端執行查詢。 下列範例顯示使用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 路徑,以查詢本機索引,如下列範例所示:

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

AQS 型查詢

AQS 是 Windows 搜尋用來查詢索引和精簡搜尋參數的預設查詢語法。 雖然 AQS 主要是使用者面向,但開發人員可以使用它以程式設計方式建置查詢。 在 Windows 7 標準 AQS 中引進,而且必須在 Windows 7 和更新版本中使用,以程式設計方式產生 AQS 查詢。 如需 AQS 的詳細資訊,請參閱 以程式設計方式使用進階查詢語法。

下列查詢索引的方法是以 AQS 為基礎。

使用 ISearchQueryHelper

您可以使用 ISearchQueryHelper 介面來開發元件或協助程式類別來查詢索引,這可讓您利用系統的某些功能,並簡化 Windows 搜尋的使用。 此介面可協助您:

  • 取得 OLE DB 連接字串 以連線到 Windows 搜尋資料庫。
  • 將使用者查詢從 AQS 轉換為 Windows 搜尋 SQL。

這個介面會實作為 ISearchCatalogManager 的協助程式類別,並透過呼叫 ISearchCatalogManager::GetQueryHelper 來取得,如下列C++範例所示。

HRESULT GetQueryHelper(ISearchQueryHelper **ppQueryHelper)
{
    *ppQueryHelper = NULL;

    // Create an instance of the search manager

    ISearchManager *pSearchManager;
    HRESULT hr = CoCreateInstance(__uuidof(CSearchManager), NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pSearchManager));
    if (SUCCEEDED(hr))
    {
        // Get the catalog manager from the search manager
        ISearchCatalogManager *pSearchCatalogManager;
        hr = pSearchManager->GetCatalog(L"SystemIndex", &pSearchCatalogManager);
        if (SUCCEEDED(hr))
        {
            // Get the query helper from the catalog manager
            hr = pSearchCatalogManager->GetQueryHelper(ppQueryHelper);
            pSearchCatalogManager->Release();
        }
        pSearchManager->Release();
    }

    return hr;
}

若要實作 ISearchQueryHelper 介面,請參閱使用 ISearchQueryHelper 介面和 ISearchQueryHelper 參考主題。

注意

舊版Microsoft Windows 桌面搜尋 (WDS) 2 倍相容性:在執行 Windows XP 和 Windows Server 2003 及更新版本的計算機上, ISearchDesktop 已被取代。 相反地,開發人員應該使用ISearchQueryHelper 來取得 連接字串、將使用者的查詢剖析成 SQL,然後透過 OLE DB 查詢。

使用 search-ms 通訊協定

search-ms 應用程式通訊協定是啟動應用程式,例如 Windows 檔案總管以查詢 Windows 搜尋索引的慣例。 它可讓查詢使用參數值自變數來建置,包括屬性自變數、先前儲存的搜尋、進階查詢語法 (AQS)、自然查詢語法 (NQS), 以及索引器和查詢本身的語言代碼識別碼 (LCID)。

如需 search-ms 通訊協定語法的詳細資訊,請參閱 使用 search-ms 通訊協定查詢索引。

以程式設計方式查詢索引

使用 ISearchQueryHelper 查詢索引

使用 search-ms Protocol 查詢索引

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

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