Partilhar via


Usando abordagens SQL e AQS para consultar o índice

Há várias maneiras de usar a Pesquisa do Windows para consultar o índice. Este tópico descreve as abordagens baseadas em sintaxe de consulta avançada (AQS) e linguagem SQL (SQL).

Este tópico é organizado da seguinte maneira:

Consultas baseadas em SQL

SQL é uma linguagem de texto que define consultas. O SQL é comum em várias tecnologias de banco de dados diferentes. O Windows Search usa SQL, implementa um subconjunto dele e o estende adicionando elementos ao idioma. O SQL de Pesquisa do Windows usado pela Pesquisa do Windows estende partes da sintaxe de consulta de banco de dados SQL-92 e SQL-99 padrão para aprimorar sua utilidade com pesquisas baseadas em texto. Todos os recursos do SQL de Pesquisa do Windows são compatíveis com a Pesquisa do Windows no Windows XP e no Windows Server 2003 e posteriores.

Para obter mais informações sobre como usar a sintaxe do SQL de Pesquisa do Windows, consulte Consultando o índice com a sintaxe do SQL de pesquisa do Windows e Visão geral da sintaxe do SQL da Pesquisa do Windows.

As abordagens a seguir para consultar o índice são baseadas em SQL.

Usando o OLE DB

O OLE DB (Object Linking and Embedding Database) é uma API COM (Component Object Model) que permite acessar diferentes tipos de armazenamentos de dados uniformemente, incluindo bancos de dados não relacionais, como planilhas. O OLE DB separa o armazenamento de dados do aplicativo que o acessa por meio de um conjunto de abstrações que incluem a fonte de dados do Shell, a sessão, o comando e os conjuntos de linhas. Um provedor OLE DB é um componente de software que implementa a interface OLE DB para fornecer dados a aplicativos de um armazenamento de dados específico.

Você pode acessar o provedor OLE DB da Pesquisa do Windows programaticamente usando os objetos OleDbConnection e OleDbSession em C# e usando o suporte do OLE DB integrado à ATL (Biblioteca de Modelos Ativos) em C++ (via atlclidb.h). A única propriedade que precisa ser definida é a cadeia de caracteres do provedor.

Você pode usar a seguinte cadeia de caracteres:

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

Como alternativa, você pode obter a cadeia de conexão chamando ISearchQueryHelper::get_ConnectionString. Confira Usando ISearchQueryHelper para obter um exemplo.

Observação

O provedor OLE DB de Pesquisa do Windows é somente leitura e dá suporte a instruções SELECT e GROUP ON. Não há suporte para instruções INSERT e 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();
        }
    }
}

Para obter mais informações sobre o OLE DB, consulte Visão geral da programação do OLE DB. Para obter informações sobre o provedor de dados .NET Framework para OLE DB, consulte a documentação do Namespace System.Data.OleDb.

Usando o ADO e o ADO.NET

O Microsoft ActiveX Data Objects (ADO) e ADO.NET permitem que você escreva aplicativos cliente para acessar e manipular dados em um servidor de banco de dados por meio de um provedor. A Pesquisa do Windows é uma tecnologia somente leitura: você pode recuperar dados usando a Pesquisa de Área de Trabalho, mas não pode alterar dados usando a Pesquisa do Windows. No entanto, você pode passar os resultados de uma pesquisa para uma tecnologia que pode alterar os dados.

Os exemplos de código a seguir demonstram como abrir uma conexão com a fonte de dados, criar e abrir um RecordSet com uma instrução SELECT do SQL de Pesquisa do Windows e obter as URLs dos cinco maiores arquivos do índice.

Observação

Para obter informações sobre como obter a cadeia de conexão, consulte Consultando o índice com ISearchQueryHelper e ISearchQueryHelyHelper::get_Connection String.

ADO e 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 e 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 e VisualBasic

Primeiro, adicione uma referência ao ADODB em seu projeto

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 e 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();
    }
}

Usando SQL em consultas locais e remotas

Você pode executar suas consultas local ou remotamente. Uma consulta local usando a cláusula FROM é mostrada no exemplo a seguir. Uma consulta local consulta apenas o catálogo systemIndex local.

FROM SystemIndex

Uma consulta remota usando a cláusula FROM é mostrada no exemplo a seguir. Adicionar ComputerName transforma o exemplo anterior em uma consulta remota.

FROM [<ComputerName>.]SystemIndex

Por padrão, o Windows XP e o Windows Server 2003 não têm o Windows Search instalado. Somente o Windows Search 4 (WS4) fornece suporte a consultas remotas. As versões anteriores da Pesquisa da Área de Trabalho do Windows (WDS), como 3.01 e anteriores, não dão suporte à consulta remota. Com o Windows Explorer você pode consultar o índice local de um computador remoto em busca de itens do sistema de arquivos (itens manipulados pelo protocolo "file:").

Para recuperar um item por consulta remota, o item deve atender aos seguintes requisitos:

  • Seja acessível por meio do caminho UNC (Convenção Universal de Nomenclatura).
  • Existe no computador remoto ao qual o cliente tem acesso.
  • Tenha sua segurança definida para permitir que o cliente tenha acesso de leitura.

O Windows Explorer tem recursos para compartilhar itens, incluindo um compartilhamento "Público" (\\Máquina\Pública\...) no Centro de Rede e Compartilhamento e um compartilhamento "Usuários" (\\Computador\Usuários\...) para itens compartilhados por meio do Assistente de Compartilhamento. Depois de compartilhar as pastas, você pode consultar o índice local especificando o nome do computador remoto na cláusula FROM e um caminho UNC no computador remoto na cláusula SCOPE, conforme mostrado no exemplo a seguir:

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

Consultas baseadas em AQS

O AQS é a sintaxe de consulta padrão usada pelo Windows Search para consultar o índice e refinar e restringir parâmetros de pesquisa. Embora o AQS seja voltado principalmente para o usuário, ele pode ser usado por desenvolvedores para criar consultas programaticamente. No Windows 7, o AQS canônico foi introduzido e deve ser usado no Windows 7 e posterior para gerar consultas do AQS programaticamente. Para obter informações detalhadas sobre o AQS, consulte Usando a sintaxe de consulta avançada programaticamente.

As abordagens a seguir para consultar o índice são baseadas em AQS.

Usando ISearchQueryHelper

Você pode desenvolver um componente ou classe auxiliar para consultar o índice usando a interface ISearchQueryHelper , que permite que você aproveite alguns recursos do sistema e simplifique o uso do Windows Search. Essa interface ajuda você a:

  • Obtenha uma cadeia de conexão OLE DB para se conectar ao banco de dados do Windows Search.
  • Converta consultas de usuário do AQS para o SQL de Pesquisa do Windows.

Essa interface é implementada como uma classe auxiliar para ISearchCatalogManager e é obtida chamando ISearchCatalogManager::GetQueryHelper, conforme mostrado no exemplo C++ a seguir.

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;
}

Para implementar a interface ISearchQueryHelper , consulte Usando a interface ISearchQueryHelper e o tópico de referência ISearchQueryHelper .

Observação

Compatibilidade herdada do WDS (Pesquisa de Área de Trabalho do Microsoft Windows) 2x: em computadores que executam o Windows XP e o Windows Server 2003 e posterior, o ISearchDesktop foi preterido. Em vez disso, os desenvolvedores devem usar ISearchQueryHelper para obter uma cadeia de conexão, analisar a consulta do usuário no SQL e, em seguida, consultar por meio do OLE DB.

Usando o protocolo search-ms

O protocolo de aplicativosearch-ms é uma convenção para iniciar um aplicativo, como o Windows Explorer, para consultar o índice da Pesquisa do Windows. Ele permite que as consultas sejam criadas com argumentos parâmetro-valor, incluindo argumentos de propriedade, pesquisas salvas anteriormente, sintaxe de consulta avançada (AQS), sintaxe de consulta natural (NQS) e LCIDs (identificadores de código de linguagem) para o indexador e a própria consulta.

Para obter informações detalhadas sobre a sintaxe do protocolo search-ms, consulte Consultando o índice com o protocolo search-ms.

Consulta do índice de maneira programática

Consultando o índice com ISearchQueryHelper

Consultando o índice com o protocolo search-ms

Consultando o índice com a sintaxe do SQL da Pesquisa do Windows

Usando a sintaxe de consulta avançada programaticamente