使用 SQL 和 AQS 方法查询索引

有多种方法可以使用 Windows 搜索来查询索引。 本主题概述了高级查询语法 (AQS) 和结构化查询语言 (基于 SQL) 的方法。

本主题的组织方式如下:

基于 SQL 的查询

SQL 是一种用于定义查询的文本语言。 SQL 在许多不同的数据库技术中很常见。 Windows 搜索使用 SQL,实现 SQL 的子集,并通过向语言添加元素来扩展 SQL。 Windows 搜索使用的 Windows 搜索 SQL 扩展了标准 SQL-92 和 SQL-99 数据库查询语法的部分,以增强其基于文本的搜索的有用性。 Windows 搜索 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 对象,以及通过 atlclidb.h) (C++) 中内置的 OLE DB 支持,以编程方式访问 Windows 搜索 (OLE DB 提供程序。 唯一必须设置的属性是提供程序字符串。

可以使用以下字符串:

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

或者,可以通过调用 ISearchQueryHelper::get_ConnectionString 获取连接字符串。 有关示例,请参阅使用 ISearchQueryHelper

注意

Windows 搜索 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 编程概述。 有关 OLE DB .NET Framework数据提供程序的信息,请参阅 System.Data.OleDb 命名空间文档。

使用 ADO 和 ADO.NET

通过 Microsoft ActiveX 数据对象 (ADO) 和 ADO.NET,可以编写客户端应用程序,以便通过提供程序访问和操作数据库服务器中的数据。 Windows 搜索是一种只读技术:可以使用桌面搜索检索数据,但不能使用 Windows 搜索更改数据。 但是,可以将搜索结果传递给可以更改数据的技术。

下面的代码示例演示如何打开与数据源的连接,如何使用 Windows 搜索 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 Search 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 协议查询索引

使用 Windows 搜索 SQL 语法查询索引

以编程方式使用高级查询语法