Freigeben über


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

Es gibt mehrere Möglichkeiten, den Index mithilfe von Windows Search abzufragen. In diesem Thema werden AQS-basierte Ansätze (Advanced Query Syntax) und strukturierte Abfragesprache (SQL) beschrieben.

Dieses Thema ist wie folgt organisiert:

SQL-basierte Abfragen

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

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

Die folgenden Ansätze zum Abfragen des Indexes basieren auf SQL.

Verwenden von OLE DB

Ole DB (Object Linking and Embedding Database) ist eine COM-API (Component Object Model), mit der Sie einheitlich auf verschiedene Arten von Datenspeichern zugreifen können, einschließlich nicht relationaler Datenbanken wie Tabellenkalkulationen. OLE DB trennt den Datenspeicher von der Anwendung, die darauf zugreift, über 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 programmgesteuert auf den OLE DB-Anbieter von Windows Search zugreifen, indem Sie die OleDbConnection- und OleDbSession-Objekte in C# und die OLE DB-Unterstützung verwenden, die in die Active Template Library (ATL) in C++ integriert ist (über atlclidb.h). 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 von ISearchQueryHelper .

Hinweis

Der WINDOWS Search OLE DB-Anbieter 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-Datenanbieters für OLE DB finden Sie in der Dokumentation zum System.Data.OleDb-Namespace.

Verwenden von ADO und ADO.NET

Microsoft ActiveX Data Objects (ADO) und ADO.NET ermöglichen es Ihnen, Clientanwendungen zu schreiben, um über einen Anbieter auf Daten auf einem Datenbankserver zuzugreifen und diese zu bearbeiten. Windows Search ist eine schreibgeschützte Technologie: Sie können Daten mithilfe der Desktopsuche abrufen, aber keine Daten mithilfe von Windows Search ändern. Sie können jedoch die Ergebnisse einer Suche an eine Technologie übergeben, die Daten ändern kann.

Die folgenden Codebeispiele veranschaulichen, wie Sie eine Verbindung mit der Datenquelle öffnen, ein RecordSet mit einer SQL SELECT-Anweisung von Windows Search erstellen und öffnen und die URLs der fünf größten Dateien aus dem Index abrufen.

Hinweis

Informationen zum Abrufen der Verbindungszeichenfolge finden Sie unter Abfragen des Index mit ISearchQueryHelper und ISearchQueryHelper::get_Connection String.

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 und 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 zunächst einen Verweis auf ADODB in Ihrem Projekt 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. Eine lokale Abfrage, die die FROM-Klausel verwendet, wird im folgenden Beispiel gezeigt. Eine lokale Abfrage fragt nur den lokalen SystemIndex-Katalog ab.

FROM SystemIndex

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

FROM [<ComputerName>.]SystemIndex

Windows XP und Windows Server 2003 sind nicht standardmäßig 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 keine Remoteabfragen. Mit Windows Explorer können Sie den lokalen Index eines Remotecomputers nach Dateisystemelementen (elemente, die vom Protokoll "file:" behandelt werden) abfragen.

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

  • Der Zugriff erfolgt über den UNC-Pfad (Universal Naming Convention).
  • Auf dem Remotecomputer vorhanden, auf den der Client Zugriff hat.
  • Legen Sie die Sicherheit fest, um dem Client Lesezugriff zu ermöglichen.

Windows Explorer verfügt über Funktionen zum Freigeben von Elementen, einschließlich einer "öffentlichen" Freigabe (\\Machine\Public\...) im Netzwerk- und Freigabecenter und einer Benutzerfreigabe (\\Machine\Users\...) für Elemente, die über den Freigabe-Assistenten freigegeben werden. Nachdem Sie 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 Standardabfragesyntax, die von der Windows-Suche zum Abfragen des Indexes und zum Verfeinern und Einschränken von Suchparametern verwendet wird. Obwohl 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 und muss in Windows 7 und höher verwendet werden, um AQS-Abfragen programmgesteuert zu generieren. Ausführliche Informationen zu AQS finden Sie unter Programmgesteuertes Verwenden der erweiterten Abfragesyntax.

Die folgenden Ansätze zum Abfragen des Indexes basieren auf AQS.

Verwenden von ISearchQueryHelper

Sie können eine Komponente oder Hilfsklasse zum Abfragen des Index entwickeln, indem Sie die ISearchQueryHelper-Schnittstelle verwenden, mit der Sie einige Features des Systems nutzen und die Verwendung von Windows Search vereinfachen können. Diese Schnittstelle unterstützt Sie bei folgenden Aktionen:

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

Diese Schnittstelle wird als Hilfsklasse für ISearchCatalogManager implementiert und abgerufen, indem ISearchCatalogManager::GetQueryHelper aufgerufen wird, 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

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

Verwenden des search-ms-Protokolls

Das Search-ms-Anwendungsprotokoll ist eine Konvention zum Starten einer Anwendung wie Windows Explorer, um den Windows Search-Index abzufragen. Es ermöglicht das Erstellen von Abfragen mit Parameter-Wert-Argumenten, einschließlich Eigenschaftsargumenten, zuvor gespeicherter Suchvorgänge, erweiterter Abfragesyntax (AQS), natürlicher Abfragesyntax (NQS) und Sprachcodebezeichnern (Language Code Identifiers, 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 Index mit dem search-ms-Protokoll.

Programm gesteuertes Abfragen des Indexes

Abfragen des Indexes mit ISearchQueryHelper

Abfragen des Indexes mit dem search-ms-Protokoll

Abfragen des Indexes mit der SQL-Syntax von Windows Search

Programmgesteuertes Verwenden der erweiterten Abfragesyntax