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.
Tópicos relacionados
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários