Uso de métodos SQL y AQS para consultar el índice
Hay varias maneras de usar Windows Search para consultar el índice. En este tema se describen los enfoques basados en la sintaxis de consulta avanzada (AQS) y el lenguaje de consulta estructurado (SQL).
Este tema se organiza de la siguiente manera:
Consultas basadas en SQL
SQL es un lenguaje de texto que define consultas. SQL es común en muchas tecnologías de base de datos diferentes. Windows Search usa SQL, implementa un subconjunto de este lenguaje y lo amplía agregándole elementos. El SQL usado por Windows Search amplía partes de la sintaxis de consulta de base de datos SQL-92 y SQL-99 estándar para mejorar su utilidad con las búsquedas basadas en texto. Todas las características del SQL de Windows Search son compatibles con Windows Search en Windows XP y Windows Server 2003 y versiones posteriores.
Para obtener más información sobre el uso de la sintaxis SQL de Windows Search, vea Consultar el índice con la sintaxis SQL de Windows Search y Descripción general de la sintaxis SQL de Windows Search.
Los métodos siguientes para consultar el índice se basan en SQL.
Uso de OLE DB
La base de datos de vinculación e incrustación de objetos (OLE DB) es una API de modelo de objetos componentes (COM) que permite acceder a diferentes tipos de almacenes de datos de manera uniforme, incluidas bases de datos no relacionales como las hojas de cálculo. OLE DB separa el almacén de datos de la aplicación que accede a él a través de un conjunto de abstracciones que incluyen el origen de datos de Shell, la sesión, el comando y los conjuntos de filas. Un proveedor OLE DB es un componente de software que implementa la interfaz OLE DB para proporcionar datos a las aplicaciones de un almacén de datos concreto.
Puede acceder al proveedor OLE DB de Windows Search mediante programación utilizando los objetos OleDbConnection y OleDbSession de C# y la compatibilidad de OLE DB integrada en la biblioteca de plantillas activas (ATL) en C++ (a través de atlclidb.h). La única propiedad que se tiene que establecer es la cadena del proveedor.
Puede usar la cadena siguiente:
provider=Search.CollatorDSO;EXTENDED PROPERTIES="Application=Windows"
Como alternativa, puede obtener la cadena de conexión llamando a ISearchQueryHelper::get_ConnectionString. Para ver un ejemplo, consulte Uso de ISearchQueryHelper.
Nota:
El proveedor OLE DB de Windows Search es de solo lectura y admite instrucciones SELECT y GROUP ON. No se admiten las instrucciones INSERT y 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 más información sobre OLE DB, consulte Información general sobre la programación de OLE DB. Para obtener información sobre el proveedor de datos .NET Framework para OLE DB, consulte la documentación del Espacio de nombres System.Data.OleDb.
Utilización de ADO y ADO.NET
Microsoft ActiveX Data Objects (ADO) y ADO.NET permiten escribir aplicaciones cliente para acceder a los datos y manipularlos en un servidor de bases de datos a través de un proveedor. Windows Search es una tecnología de solo lectura: el usuario puede recuperar datos mediante con Desktop Search, pero no puede cambiar los datos con Windows Search. Sin embargo, puede transferir los resultados de una búsqueda a una tecnología que pueda cambiar los datos.
En los ejemplos de código siguientes se muestra cómo abrir una conexión con el origen de datos, crear y abrir un objeto RecordSet con una instrucción SELECT de SQL de Windows Search y obtener las direcciones URL de los cinco archivos más grandes del índice.
Nota:
Para obtener información sobre cómo obtener la cadena de conexión, vea Consultar el índice con ISearchQueryHelper y ISearchQueryHelper::get_Connection String.
ADO y 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 y 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 y VisualBasic
En primer lugar, agregue una referencia a ADODB en su proyecto.
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 y 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 en consultas locales y remotas
Puede ejecutar las consultas de forma local o remota. En el ejemplo siguiente se muestra una consulta local realizada con la cláusula FROM. Una consulta local solo consulta el catálogo SystemIndex local.
FROM SystemIndex
En el ejemplo siguiente se muestra una consulta remota realizada con la cláusula FROM. Agregar ComputerName transforma el ejemplo anterior en una consulta remota.
FROM [<ComputerName>.]SystemIndex
De forma predeterminada, Windows XP y Windows Server 2003 no tienen Windows Search instalado. Solo Windows Search 4 (WS4) proporciona compatibilidad con consultas remotas. Las versiones más antiguas de Windows Desktop Search (WDS), como 3.01 y versiones anteriores, no admiten consultas remotas. Con el Explorador de Windows, puede consultar el índice local de un equipo remoto para los elementos del sistema de archivos (elementos administrados por el protocolo "file:").
Para recuperar un elemento mediante una consulta remota, el elemento debe cumplir los siguientes requisitos:
- Ser accesible a través de la ruta de acceso de la convención de nomenclatura universal (UNC).
- Existir en el equipo remoto al que tiene acceso el cliente.
- Tener la seguridad configurada para permitir que el cliente tenga acceso de lectura.
El Explorador de Windows tiene características para compartir elementos, como un recurso compartido (\\Machine\Public\...) en el Centro de redes y recursos compartidos y un recurso compartido "Users" (\\Machine\Users\...) para los elementos compartidos a través del Asistente para compartir. Después de compartir las carpetas, puede consultar el índice local especificando el nombre del equipo remoto en la cláusula FROM y una ruta de acceso UNC en el equipo remoto en la cláusula SCOPE, como se muestra en el ejemplo siguiente:
SELECT System.ItemName FROM MachineName.SystemIndex WHERE SCOPE='file://MachineName/<path>'
Consultas basadas en AQS
AQS es la sintaxis de consulta predeterminada usada por Windows Search para consultar el índice y para refinar y restringir los parámetros de búsqueda. Aunque AQS está orientada principalmente al usuario, los desarrolladores pueden usarla para crear consultas mediante programación. La sintaxis de consulta avanzada canónica se introdujo en Windows 7 y se debe usar en Windows 7 y versiones posteriores para generar consultas AQS mediante programación. Para obtener información detallada sobre AQS, consulte Uso de la sintaxis de consulta avanzada mediante programación.
Los métodos siguientes para consultar el índice se basan en AQS.
Uso de ISearchQueryHelper
Puede desarrollar un componente o una clase auxiliar para consultar el índice a través de la interfaz de ISearchQueryHelper, que permite aprovechar algunas características del sistema y simplificar el uso de Windows Search. Esta interfaz ayuda a:
- Obtener un cadena de conexión OLE DB para conectarse a la base de datos de Windows Search.
- Convertir consultas de usuario de AQS a SQL de Windows Search.
Esta interfaz se implementa como una clase auxiliar en ISearchCatalogManager y se obtiene llamando a ISearchCatalogManager::GetQueryHelper, como se muestra en el siguiente ejemplo de 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;
}
Para implementar la interfaz de ISearchQueryHelper, consulte Uso de la interfaz de ISearchQueryHelper y el tema de referencia sobre ISearchQueryHelper.
Nota:
Compatibilidad heredada de Microsoft Windows Desktop Search (WDS) 2x: en equipos que ejecutan Windows XP y Windows Server 2003 y versiones posteriores, ISearchDesktop está en desuso. En su lugar, los desarrolladores deben usar ISearchQueryHelper para obtener una cadena de conexión, analizar la consulta del usuario en SQL y, a continuación, consultar a través de OLE DB.
Uso del protocolo search-ms
El protocolo de aplicación search-ms es una convención para iniciar una aplicación, como el Explorador de Windows, para consultar el índice de Windows Search. Permite compilar consultas con argumentos de parámetro-valor, incluidos argumentos de propiedad, búsquedas guardadas previamente, sintaxis de consulta avanzada (AQS), sintaxis de consulta natural (NQS) e identificadores de código de idioma (LCID) para el indexador y la propia consulta.
Para obtener información detallada sobre la sintaxis del protocolo search-ms, vea Consultar el índice con el protocolo search-ms.