Como Usar Abordagens SQL e AQS para Consultar o Índice
Há várias maneiras de usar o Windows Search para consultar o índice. Este tópico descreve abordagens baseadas em sintaxe de consulta avançada (AQS) e linguagem de consulta estruturada (SQL).
Este tópico é organizado da seguinte maneira:
Consultas baseadas em SQL
SQL é uma linguagem de texto que define consultas. SQL é comum em muitas tecnologias de banco de dados diferentes. O Windows Search usa SQL, implementa um subconjunto dele e o estende adicionando elementos à linguagem. O Windows Search SQL usado pelo Windows Search estende partes da sintaxe de consulta de banco de dados padrão SQL-92 e SQL-99 para aprimorar sua utilidade com pesquisas baseadas em texto. Todos os recursos do Windows Search SQL são compatíveis com o Windows Search no Windows XP e no Windows Server 2003 e versões posteriores.
Para obter mais informações sobre como usar a sintaxe SQL do Windows Search, consulte Como consultar o índice com a sintaxe SQL do Windows Search e Visão geral da sintaxe SQL do Windows Search.
As abordagens a seguir para consultar o índice são baseadas em SQL.
Uso de OLE DB
O Object Linking and Embedding Database (OLE DB) é uma API de Component Object Model (COM) que permite acessar diferentes tipos de armazenamentos de dados de maneira uniforme, 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 inclui fonte de dados, sessão, comando e conjuntos de linhas do Shell. Um provedor OLE DB é um componente de software que implementa a interface OLE DB para fornecer dados aos aplicativos de um armazenamento de dados específico.
Você pode acessar o provedor OLE DB do Windows Search programaticamente usando os objetos OleDbConnection e OleDbSession em C# e usando o suporte OLE DB integrado à Active Template Library (ATL) 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 caracteres de conexão chamando ISearchQueryHelper::get_ConnectionString. Consulte Uso de ISearchQueryHelper, por exemplo.
Observação
O provedor OLE DB do Windows Search é somente leitura e oferece suporte a instruções SELECT e GROUP ON. As instruções INSERT e DELETE não são compatíveis.
#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 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 ADO e ADO.NET
Microsoft ActiveX Data Objects (ADO) e ADO.NET permitem escrever aplicativos cliente para acessar e manipular dados em um servidor de banco de dados por meio de um provedor. O Windows Search é uma tecnologia somente leitura: você pode recuperar dados usando o Desktop Search, mas não pode alterar dados usando o Windows Search. Contudo, é possível passar os resultados de uma pesquisa para uma tecnologia que possa 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 Windows Search SQL e obter as URLs dos cinco maiores arquivos do índice.
Observação
Para obter informações sobre como obter a cadeia de caracteres, consulte Como consultar o índice com ISearchQueryHelper e ISearchQueryHelper::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 no 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();
}
}
Uso de 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 possuem o Windows Search instalado. Somente o Windows Search 4 (WS4) oferece suporte a consultas remotas. Versões anteriores do Windows Desktop Search (WDS), como 3.01 e anteriores, não oferecem 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:
- Ser acessível por meio do caminho UNC (Universal Naming Convention).
- Existir no computador remoto ao qual o cliente tem acesso.
- Ter sua segurança configurada para permitir que o cliente tenha acesso de leitura.
O Windows Explorer possui recursos para compartilhar itens, incluindo um compartilhamento "Público" (\\Máquina\Público\...) na Central de Rede e Compartilhamento e um compartilhamento "Users" (\\Machine\Users\...) para itens compartilhado por meio do assistente de compartilhamento. Depois de compartilhar as pastas, você poderá consultar o índice local especificando o nome da máquina do computador remoto na cláusula FROM e um caminho UNC na máquina remota 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
AQS é a sintaxe de consulta padrão usada pelo Windows Search para consultar o índice e para refinar e restringir os 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 AQS programaticamente. Para obter informações detalhadas sobre AQS, consulte Como usar a sintaxe de consulta avançada programaticamente.
As abordagens a seguir para consultar o índice são baseadas em AQS.
Uso de ISearchQueryHelper
Você pode desenvolver um componente ou classe auxiliar para consultar o índice usando a interface ISearchQueryHelper, que permite aproveitar alguns recursos do sistema e simplificar o uso do Windows Search. Essa interface ajuda a:
- Obter uma cadeia de conexão OLE DB para se conectar ao banco de dados do Windows Search.
- Converter consultas de usuários de AQS em Windows Search SQL.
Esta 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 Como usar a interface ISearchQueryHelper e o tópico de referência ISearchQueryHelper.
Observação
Compatibilidade herdada do Microsoft Windows Desktop Search (WDS) 2x: em computadores que executam o Windows XP e o Windows Server 2003 e posterior, ISearchDesktop foi preterido. Em vez disso, os desenvolvedores devem usar ISearchQueryHelper para obter uma cadeia de conexão, analise a consulta do usuário em SQL e depois consulte por meio do OLE DB.
Uso do protocolo search-ms
O protocolo de aplicativo search-ms é uma convenção para iniciar um aplicativo, como o Windows Explorer, para consultar o índice do Windows Search. Ele permite que consultas sejam construídas com argumentos de valor de parâmetro, incluindo argumentos de propriedade, pesquisas salvas anteriormente, sintaxe de consulta avançada (AQS), sintaxe de consulta natural (NQS) e identificadores de código de idioma (LCIDs) para o indexador e a própria consulta.
Para obter informações detalhadas sobre a sintaxe do protocolo search-ms, consulte Como consultar o índice com o protocolo search-ms.