Freigeben über


Verwenden von SQL- und AQS-Ansätzen zum Abfragen des Index

Es gibt mehrere Möglichkeiten, mit Windows Search den Index abzufragen. In diesem Thema werden Ansätze auf der Grundlage der erweiterten Abfragesyntax (AQS) und der strukturierten Abfragesprache (SQL) beschrieben.

Dieses Thema ist wie folgt organisiert:

SQL-basierte Abfragen

SQL ist eine Textsprache, die Abfragen definiert. SQL kommt in vielen verschiedenen Datenbanktechnologien zum Einsatz. Windows Search verwendet SQL, implementiert eine Teilmenge davon und erweitert sie durch Hinzufügen von Elementen zur Sprache. Die von der Windows-Suche verwendete Windows Search SQL erweitert Teile der standardmäßigen SQL-92- und SQL-99-Datenbankabfragesyntax, um ihre Nützlichkeit bei textbasierten Suchvorgängen zu verbessern. Alle Features von Windows Search SQL sind mit Windows-Suche unter Windows XP und Windows Server 2003 und höher kompatibel.

Weitere Informationen zur Verwendung der Windows Search SQL-Syntax finden Sie unter Abfragen des Indexes mit Windows Search SQL-Syntax und Übersicht über die SQL-Syntax der Windows-Suche.

Die folgenden Abfrageverfahren für den Index basieren auf SQL.

Verwenden von OLE DB

Die Object Linking and Embedding Database (OLE DB) ist eine Component Object Model-(COM-)API, die Ihnen den einheitlichen Zugriff auf verschiedene Arten von Datenspeichern ermöglicht, einschließlich nicht relationaler Datenbanken wie Tabellenkalkulationen. OLE DB trennt den Datenspeicher von der Anwendung, auf die sie zugreift, durch eine Reihe von Abstraktionen, die die Shell-Datenquelle, Sitzung, Befehle und Rowsets enthalten. Ein OLE DB-Anbieter ist eine Softwarekomponente, die die OLE DB-Schnittstelle implementiert, um Daten für Anwendungen aus einem bestimmten Datenspeicher bereitzustellen.

Sie können auf das Windows Search OLE DB-Anbieterprogramm zugreifen, indem Sie die OleDbConnection- und OleDbSession-Objekte in C# und die in Active Template Library (ATL) integrierte OLE DB-Unterstützung in C++ (über atlclidb.h) verwenden. Die einzige Eigenschaft, die festgelegt werden muss, ist die Anbieterzeichenfolge.

Sie können die folgende Zeichenfolge verwenden:

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

Alternativ können Sie die Verbindungszeichenfolge abrufen, indem Sie ISearchQueryHelper::get_ConnectionString aufrufen. Ein Beispiel finden Sie unter Verwenden des ISearchQueryHelper.

Hinweis

Der OLE DB-Anbieter der Windows-Suche ist schreibgeschützt und unterstützt SELECT- und GROUP ON-Anweisungen. INSERT- und DELETE-Anweisungen werden nicht unterstützt.

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

Weitere Informationen zu OLE DB finden Sie unter Übersicht über die OLE DB-Programmierung. Informationen zum .NET Framework-Datenanbieter für OLE DB finden Sie in der Dokumentation zum System.Data.OleDb-Namespace.

Verwenden von ADO und ADO.NET

Mit Microsoft ActiveX Data Objects (ADO) und ADO.NET können Sie Clientanwendungen schreiben, um auf Daten in einem Datenbankserver über einen Anbieter zuzugreifen und sie zu bearbeiten. Die Windows-Suche ist eine schreibgeschützte Technologie: Sie können Daten mithilfe der Desktopsuche abrufen, aber Sie können Daten nicht mithilfe der Windows-Suche ändern. Sie können jedoch die Ergebnisse einer Suche an eine Technologie übergeben, die Daten ändern kann.

Die folgenden Code-Beispiele zeigen, wie Sie eine Verbindung zur Datenquelle herstellen, ein RecordSet mit einer Windows-Suche-SQL SELECT-Anweisung erstellen und öffnen und die URLs der fünf größten Dateien aus dem Index abrufen.

Hinweis

Informationen zum Abrufen des Verbindungszeichenfolge finden Sie unter Abfragen des Indexes mit ISearchQueryHelper und ISearchQueryHelper::get_ConnectionString.

ADO und 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 and 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 und VisualBasic

Fügen Sie in Ihrem Projekt zunächst einen Verweis auf ADODB hinzu

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

Verwenden von SQL in lokalen und Remoteabfragen

Sie können Ihre Abfragen entweder lokal oder remote ausführen. Im folgenden Beispiel wird eine lokale Abfrage mit der FROM-Klausel gezeigt. Eine lokale Abfrage fragt nur den lokalen SystemIndex-Katalog ab.

FROM SystemIndex

Im folgenden Beispiel wird eine Remoteabfrage mit der FROM-Klausel gezeigt. Durch Hinzufügen von ComputerName wird das vorherige Beispiel in eine Remoteabfrage umgewandelt.

FROM [<ComputerName>.]SystemIndex

Standardmäßig ist die Windows-Suche in Windows XP und Windows Server 2003 nicht installiert. Nur Windows Search 4 (WS4) bietet Remoteabfrageunterstützung. Frühere Versionen von Windows Desktop Search (WDS), z. B. 3.01 und früher, unterstützen die Remoteabfrage nicht. Mit Windows Explorer können Sie den lokalen Index eines Remotecomputers nach Dateisystemelementen (Elemente, die vom „file:“-Protokoll verarbeitet werden) durchsuchen.

Um ein Element nach Remoteabfrage abzurufen, muss das Element die folgenden Anforderungen erfüllen:

  • Sie können über den Universal Naming Convention-(UNC-)-Pfad darauf zugreifen.
  • Auf dem Remotecomputer vorhanden, auf den der Client Zugriff hat.
  • Stellen Sie die Sicherheit so ein, dass der Client Lesezugriff hat.

Windows Explorer verfügt über Features zum Freigeben von Elementen, einschließlich einer „Public“-Freigabe (\\Machine\Public\...) im Netzwerk- und Freigabecenter und einer „Users“-Freigabe (\\Computer\Benutzer\...) für Elemente, die über den Freigabe-Assistenten freigegeben wurden. Nachdem Sie den oder die Ordner freigegeben haben, können Sie den lokalen Index abfragen, indem Sie den Computernamen des Remotecomputers in der FROM-Klausel und einen UNC-Pfad auf dem Remotecomputer in der SCOPE-Klausel angeben, wie im folgenden Beispiel gezeigt:

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

AQS-basierte Abfragen

AQS ist die standardmäßige Abfragesyntax, die von der Windows-Suche zum Abfragen des Indexes und zum Verfeinern und Einschränken von Suchparametern verwendet wird. Während AQS in erster Linie benutzerseitig ist, kann sie von Entwicklern verwendet werden, um Abfragen programmgesteuert zu erstellen. In Windows 7 wurde die kanonische AQS eingeführt, die in Windows 7 und späteren Versionen verwendet werden muss, um AQS-Abfragen programmgesteuert zu generieren. Ausführliche Informationen zu AQS finden Sie unter Programmgesteuertes Verwenden der erweiterten Abfragesyntax.

Die folgenden Abfrageverfahren für den Index basieren auf AQS.

Verwenden von ISearchQueryHelper

Sie können eine Komponente oder Hilfsklasse entwickeln, um den Index abzufragen, indem Sie die ISearchQueryHelper-Schnittstelle verwenden, mit der Sie einige Features des Systems nutzen und die Verwendung der Windows-Suche vereinfachen können. Diese Schnittstelle unterstützt Sie bei folgenden Vorgängen:

  • Rufen Sie eine OLE DB-Verbindungszeichenfolge ab, um eine Verbindung mit der Windows Suche-Datenbank herzustellen.
  • Konvertieren von Benutzerabfragen von AQS in Windows-Suche-SQL.

Diese Schnittstelle wird als Hilfsklasse für ISearchCatalogManager implementiert und wird durch Aufrufen von ISearchCatalogManager::GetQueryHelper abgerufen, wie im folgenden C++-Beispiel gezeigt.

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

Informationen zum Implementieren der ISearchQueryHelper-Schnittstelle finden Sie unter Verwenden der ISearchQueryHelper-Schnittstelle und im Referenzthema ISearchQueryHelper.

Hinweis

Ältere Microsoft Windows Desktop Search (WDS) 2x-Kompatibilität: Auf Computern mit Windows XP und Windows Server 2003 und höher ist ISearchDesktop veraltet. Stattdessen sollten Entwickler ISearchQueryHelper, um eine Verbindungszeichenfolge abzurufen, die Abfrage des Benutzers in SQL zu analysieren und dann eine Abfrage über OLE DB durchzuführen.

Verwenden des search-ms-Protokolls

Das search-ms -Anwendungsprotokoll ist eine Konvention zum Starten einer Anwendung wie Windows Explorer, um den Windows-Suchindex abzufragen. Sie ermöglicht die Erstellung von Abfragen mit Parameterwertargumenten, einschließlich Eigenschaftenargumenten, zuvor gespeicherten Suchvorgängen, erweiterter Abfragesyntax (AQS), natürlicher Abfragesyntax (NQS) und Sprachcodebezeichnern (LCIDs) sowohl für den Indexer als auch für die Abfrage selbst.

Ausführliche Informationen zur search-ms-Protokollsyntax finden Sie unter Abfragen des Indexes mit dem search-ms-Protokoll.

Programm gesteuertes Abfragen des Indexes

Abfragen des Index mit ISearchQueryHelper

Abfragen des Index mit dem search-ms-Protokoll

Abfragen des Indexes mit Windows Search SQL-Syntax

Programmgesteuerte Verwendung der erweiterten Abfragesyntax