Uso di approcci SQL e AQS per eseguire query sull'indice

Esistono diversi modi per usare Windows Search per eseguire query sull'indice. In questo argomento vengono descritti gli approcci basati su Sintassi query avanzata (AQS) e Structured Query Language (SQL).

Questo argomento è organizzato come segue:

Query basate su SQL

SQL è un linguaggio di testo che definisce le query. SQL è comune in molte tecnologie di database diverse. Windows Search usa SQL, implementa un sottoinsieme e lo estende aggiungendo elementi al linguaggio. Windows Search SQL usato da Windows Search estende parti della sintassi di query di database SQL-92 e SQL-99 standard per migliorarne l'utilità con le ricerche basate su testo. Tutte le funzionalità di Windows Search SQL sono compatibili con Windows Search in Windows XP e Windows Server 2003 e versioni successive.

Per altre informazioni sull'uso della sintassi SQL di Windows Search, vedere Esecuzione di query sull'indice con sintassi SQL di Windows Search e Panoramica della sintassi SQL di Windows Search.

Gli approcci seguenti per l'esecuzione di query sull'indice sono basati su SQL.

Uso di OLE DB

Il database OLE DB (Object Linking and Embedding Database) è un'API COM (Component Object Model) che consente di accedere in modo uniforme a diversi tipi di archivi dati, inclusi database non relazionali come fogli di calcolo. OLE DB separa l'archivio dati dall'applicazione a cui accede tramite un set di astrazioni che includono l'origine dati shell, la sessione, il comando e i set di righe. Un provider OLE DB è un componente software che implementa l'interfaccia OLE DB per fornire dati alle applicazioni da un archivio dati specifico.

È possibile accedere al provider OLE DB di Windows Search a livello di codice usando gli oggetti OleDbConnection e OleDbSession in C# e usando il supporto OLE DB integrato in Active Template Library (ATL) in C++ (tramite atlclidb.h). L'unica proprietà che deve essere impostata è la stringa del provider.

È possibile usare la stringa seguente:

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

In alternativa, è possibile ottenere il stringa di connessione chiamando ISearchQueryHelper::get_ConnectionString. Per un esempio, vedere Uso di ISearchQueryHelper .

Nota

Il provider OLE DB di Windows Search è di sola lettura e supporta le istruzioni SELECT e GROUP ON. Le istruzioni INSERT e DELETE non sono supportate.

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

Per altre informazioni su OLE DB, vedere Panoramica della programmazione OLE DB. Per informazioni sul provider di dati .NET Framework per OLE DB, vedere la documentazione relativa allo spazio dei nomi System.Data.OleDb.

Uso di ADO e ADO.NET

Microsoft ActiveX Data Objects (ADO) e ADO.NET consentono di scrivere applicazioni client per accedere e modificare i dati in un server di database tramite un provider. Windows Search è una tecnologia di sola lettura: è possibile recuperare i dati usando Ricerca desktop, ma non è possibile modificare i dati usando Windows Search. È tuttavia possibile passare i risultati di una ricerca a una tecnologia in grado di modificare i dati.

Gli esempi di codice seguenti illustrano come aprire una connessione all'origine dati, creare e aprire un oggetto RecordSet con un'istruzione SQL SELECT di Windows Search e ottenere gli URL dei cinque file più grandi dall'indice.

Nota

Per informazioni su come ottenere il stringa di connessione, vedere Esecuzione di query sull'indice con 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

Aggiungere innanzitutto un riferimento ad ADODB nel progetto

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 di SQL nelle query locali e remote

È possibile eseguire le query in locale o in remoto. Nell'esempio seguente viene illustrata una query locale che usa la clausola FROM. Una query locale esegue una query solo sul catalogo SystemIndex locale.

FROM SystemIndex

Nell'esempio seguente viene illustrata una query remota che usa la clausola FROM. L'aggiunta di ComputerName trasforma l'esempio precedente in una query remota.

FROM [<ComputerName>.]SystemIndex

Per impostazione predefinita, Windows XP e Windows Server 2003 non dispongono di Windows Search installato. Solo Windows Search 4 (WS4) offre supporto per le query remote. Le versioni precedenti di Windows Desktop Search (WDS), ad esempio 3.01 e versioni precedenti, non supportano l'esecuzione di query remote. Con Esplora risorse è possibile eseguire una query sull'indice locale di un computer remoto per gli elementi del file system (elementi gestiti dal protocollo "file:").

Per recuperare un elemento tramite query remota, l'elemento deve soddisfare i requisiti seguenti:

  • Essere accessibile tramite il percorso UNC (Universal Naming Convention).
  • Esiste nel computer remoto a cui il client ha accesso.
  • Impostare la sicurezza per consentire al client di disporre dell'accesso in lettura.

Esplora risorse include funzionalità per la condivisione di elementi, tra cui una condivisione "Pubblica" (\\Machine\Public\...) nel Centro rete e condivisione e una condivisione "Utenti" (\\Machine\Users\...) per gli elementi condivisi tramite la Condivisione guidata. Dopo aver condiviso le cartelle, è possibile eseguire una query sull'indice locale specificando il nome del computer remoto nella clausola FROM e un percorso UNC nel computer remoto nella clausola SCOPE, come illustrato nell'esempio seguente:

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

Query basate su AQS

AQS è la sintassi di query predefinita usata da Windows Search per eseguire query sull'indice e per perfezionare e restringere i parametri di ricerca. Anche se AQS è rivolto principalmente all'utente, può essere usato dagli sviluppatori per compilare query a livello di codice. In Windows 7 è stata introdotta la funzionalità AQS canonica e deve essere usata in Windows 7 e versioni successive per generare query AQS a livello di codice. Per informazioni dettagliate su AQS, vedere Uso della sintassi di query avanzata a livello di codice.

Gli approcci seguenti per l'esecuzione di query sull'indice sono basati su AQS.

Uso di ISearchQueryHelper

È possibile sviluppare un componente o una classe helper per eseguire query sull'indice usando l'interfaccia ISearchQueryHelper , che consente di sfruttare alcune funzionalità del sistema e semplificare l'uso di Windows Search. Questa interfaccia consente di:

  • Ottenere un stringa di connessione OLE DB per connettersi al database di Windows Search.
  • Convertire le query utente da AQS a Windows Search SQL.

Questa interfaccia viene implementata come classe helper per ISearchCatalogManager ed è ottenuta chiamando ISearchCatalogManager::GetQueryHelper, come illustrato nell'esempio C++ seguente.

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

Per implementare l'interfaccia ISearchQueryHelper, vedere Uso dell'interfaccia ISearchQueryHelper e dell'argomento di riferimento ISearchQueryHelper.

Nota

Compatibilità legacy di Microsoft Windows Desktop Search (WDS) 2x: nei computer che eseguono Windows XP e Windows Server 2003 e versioni successive, ISearchDesktop è deprecato. Gli sviluppatori devono invece usare ISearchQueryHelper per ottenere un stringa di connessione, analizzare la query dell'utente in SQL e quindi eseguire query tramite OLE DB.

Uso del protocollo search-ms

Il protocollo dell'applicazione search-ms è una convenzione per avviare un'applicazione, ad esempio Esplora risorse, per eseguire query sull'indice di Windows Search. Consente di compilare query con argomenti con valori di parametro, inclusi argomenti di proprietà, ricerche salvate in precedenza, Sintassi query avanzata (AQS), Sintassi query naturale (NQS) e identificatori di codice del linguaggio (LCID) sia per l'indicizzatore che per la query stessa.

Per informazioni dettagliate sulla sintassi del protocollo search-ms, vedere Esecuzione di query sull'indice con il protocollo search-ms.

Esecuzione di query sull'indice a livello di codice

Esecuzione di query sull'indice con ISearchQueryHelper

Esecuzione di query sull'indice con il protocollo search-ms

Esecuzione di query sull'indice con la sintassi SQL di Windows Search

Uso della sintassi di query avanzata a livello di codice