SQL- en AQS-benaderingen gebruiken om een query uit te voeren op de index

Er zijn verschillende manieren om Windows Search te gebruiken om een query uit te voeren op de index. In dit onderwerp vindt u een overzicht van geavanceerde querysyntaxis (AQS) en op SQL gebaseerde benaderingen (Structured Query Language).

Dit onderwerp is als volgt ingedeeld:

Query's op basis van SQL

SQL is een teksttaal waarmee query's worden gedefinieerd. SQL is gebruikelijk in veel verschillende databasetechnologieën. Windows Search maakt gebruik van SQL, implementeert een subset ervan en breidt deze uit door elementen toe te voegen aan de taal. De Windows Search SQL die door Windows Search wordt gebruikt, breidt delen van de standaard-SQL-92- en SQL-99-databasequerysyntaxis uit om de bruikbaarheid ervan te verbeteren met zoekopdrachten op basis van tekst. Alle functies van Windows Search SQL zijn compatibel met Windows Search op Windows XP en Windows Server 2003 en hoger.

Voor meer informatie over het gebruik van Windows Search SQL-syntaxis, zie Query's uitvoeren op de index met Windows Search SQL-syntaxis en Overzicht van de Windows Search SQL-syntaxis.

De volgende benaderingen voor het uitvoeren van query's op de index zijn gebaseerd op SQL.

OLE DB gebruiken

De OBJECT Linking and Embedding Database (OLE DB) is een COM-API (Component Object Model) waarmee u uniform toegang hebt tot verschillende typen gegevensarchieven, inclusief niet-relationele databases zoals spreadsheets. OLE DB scheidt het gegevensarchief van de toepassing die deze opent via een reeks abstracties die de Shell-gegevensbron, sessie, opdracht en rijensets bevatten. Een OLE DB-provider is een softwareonderdeel dat de OLE DB-interface implementeert om gegevens te leveren aan toepassingen uit een bepaald gegevensarchief.

U kunt programmatisch toegang krijgen tot de OLE DB-provider van Windows Search met behulp van de OleDbConnection- en OleDbSession-objecten in C# en met behulp van de OLE DB-ondersteuning die is ingebouwd in Active Template Library (ATL) in C++ (via atlclidb.h). De enige eigenschap die moet worden ingesteld, is de provider-string.

U kunt de volgende tekenreeks gebruiken:

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

U kunt ook de verbindingsreeks ophalen door ISearchQueryHelper::get_ConnectionStringaan te roepen. Zie Using ISearchQueryHelper voor een voorbeeld.

Notitie

De OLE DB-provider voor Windows Search is alleen-lezen en biedt ondersteuning voor SELECT- en GROUP ON-instructies. INSERT- en DELETE-instructies worden niet ondersteund.

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

Zie OLE DB-programmeringsoverzichtvoor meer informatie over OLE DB. Zie de documentatie System.Data.OleDb-naamruimte voor meer informatie over de .NET Framework-gegevensprovider voor OLE DB.

ADO en ADO.net gebruiken

Met Microsoft ActiveX Data Objects (ADO) en ADO.NET kunt u clienttoepassingen schrijven voor toegang tot en manipulatie van gegevens op een databaseserver via een provider. Windows Search is een technologie voor alleen-lezen: u kunt gegevens ophalen met de desktopzoekfunctie, maar u kunt geen gegevens wijzigen met Windows Search. U kunt echter de resultaten van een zoekopdracht doorgeven aan een technologie die gegevens kan wijzigen.

In de volgende codevoorbeelden ziet u hoe u een verbinding met de gegevensbron opent, een RecordSet maakt en opent met een Windows Search SQL SELECT-instructie en de URL's van de vijf grootste bestanden uit de index opvragen.

Notitie

Zie Opvragen van de index met ISearchQueryHelperen ISearchQueryHelper::get_ConnectionStringvoor meer informatie over het verkrijgen van de connectiestring.

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

Voeg eerst een verwijzing naar ADODB toe in uw project

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

SQL gebruiken in lokale en externe query's

U kunt uw zoekopdrachten lokaal of op afstand uitvoeren. In het volgende voorbeeld wordt een lokale query weergegeven met behulp van de FROM-component. Een lokale query voert alleen query's uit op de lokale SystemIndex-catalogus.

FROM SystemIndex

Een externe query met behulp van de FROM-component wordt weergegeven in het volgende voorbeeld. Door ComputerName toe te voegen, wordt het vorige voorbeeld omgezet in een externe query.

FROM [<ComputerName>.]SystemIndex

Windows XP en Windows Server 2003 hebben standaard geen Windows Search geïnstalleerd. Alleen Windows Search 4 (WS4) biedt ondersteuning voor externe query's. Eerdere versies van Windows Desktop Search (WDS), zoals 3.01 en eerder, bieden geen ondersteuning voor externe query's. Met Windows Verkenner kunt u een query uitvoeren op de lokale index van een externe computer voor bestandssysteemitems (items die worden verwerkt door het protocol 'file:').

Om een item op afstand op te halen, moet het item voldoen aan de volgende vereisten:

  • Toegankelijk zijn via een UNC-pad (Universale Benamingsconventie).
  • Bestaan op de externe computer waartoe de client toegang heeft.
  • Stel de beveiliging zo in dat de client leestoegang heeft.

Windows Verkenner bevat functies voor het delen van items, waaronder een openbare share (\\Machine\Public\...) in het Netwerk- en deelcentrum voor delen, en een share 'Gebruikers' (\\Machine\Users\...) voor items die worden gedeeld via de wizard Delen. Nadat u de map(en) hebt gedeeld, kunt u een query uitvoeren op de lokale index door de computernaam van de externe computer op te geven in de FROM-component en een UNC-pad op de externe computer in de SCOPE-component, zoals wordt weergegeven in het volgende voorbeeld:

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

Op AQS gebaseerde zoekopdrachten

AQS is de standaardquerysyntaxis die door Windows Search wordt gebruikt om de index te doorzoeken en zoekparameters te verfijnen en te specificeren. Hoewel AQS voornamelijk gericht is op gebruikers, kan het door ontwikkelaars worden gebruikt om programmatisch query's te bouwen. In Windows 7 werd de canonieke AQS geïntroduceerd en moet deze in Windows 7 en latere versies worden gebruikt om via een programma AQS-query's te genereren. Voor gedetailleerde informatie over AQS, zie Programmaatisch gebruik van geavanceerde querysyntaxis.

De volgende methoden voor het uitvoeren van query's op de index zijn gebaseerd op AQS.

ISearchQueryHelper gebruiken

U kunt een onderdeel of helperklasse ontwikkelen om een query uit te voeren op de index met behulp van de interface ISearchQueryHelper, waarmee u kunt profiteren van bepaalde functies van het systeem en het gebruik van Windows Search kunt vereenvoudigen. Deze interface helpt u bij het volgende:

  • Haal een OLE DB-verbindingsreeks op om verbinding te maken met de Windows Search-database.
  • Gebruikersquery's converteren van AQS naar Windows Search SQL.

Deze interface wordt geïmplementeerd als een helperklasse voor ISearchCatalogManager en wordt verkregen door ISearchCatalogManager::GetQueryHelperaan te roepen, zoals wordt weergegeven in het volgende C++-voorbeeld.

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

Om de ISearchQueryHelper-interface te implementeren, zie Het gebruik van de ISearchQueryHelper-interface en het ISearchQueryHelper referentieonderwerp.

Notitie

Verouderde compatibiliteit met Microsoft Windows Desktop Search (WDS) 2x: op computers met Windows XP en Windows Server 2003 en hoger is ISearchDesktop afgeschaft. In plaats daarvan moeten ontwikkelaars ISearchQueryHelper gebruiken om een verbindingsreeks op te halen, de query van de gebruiker te parseren in SQL en vervolgens query's uit te voeren via OLE DB.

Het search-ms-protocol gebruiken

De search-msapplicatieprotocol is een conventie voor het starten van een toepassing, zoals Windows Verkenner, om een zoekopdracht uit te voeren op de Windows Search-index. Hiermee kunnen query's worden gebouwd met parameter-waardeargumenten, waaronder eigenschapargumenten, eerder opgeslagen zoekopdrachten, AQS (Advanced Query Syntax), NQS (Natural Query Syntax) en taalcode-id's (LCID's) voor zowel de indexeerfunctie als de query zelf.

Zie Query's uitvoeren op de index met de search-ms Protocolvoor gedetailleerde informatie over de syntaxis van het protocol search-ms.

query's uitvoeren op de index via een programma

query's uitvoeren op de index met ISearchQueryHelper

query's uitvoeren op de index met de search-ms Protocol-

query's uitvoeren op de index met de SQL-syntaxis van Windows Search

Geavanceerde querysyntaxis programmatisch gebruiken