Utilisation de SQL et d’approches AQS pour interroger l’index

Il existe plusieurs façons d’utiliser Windows Recherche pour interroger l’index. Cette rubrique décrit les approches basées sur la syntaxe de requête avancée (AQS) et les approches langage SQL (SQL).

Cette rubrique est organisée comme suit :

requêtes basées sur SQL

SQL est une langue de texte qui définit les requêtes. SQL est courant dans de nombreuses technologies de base de données différentes. Windows Search utilise SQL, implémente un sous-ensemble de celui-ci et l’étend en ajoutant des éléments au langage. Le SQL recherche Windows utilisé par Windows Search étend les parties de la syntaxe de requête de base de données standard SQL-92 et SQL-99 pour améliorer son utilité avec les recherches textuelles. Toutes les fonctionnalités des SQL de recherche de Windows sont compatibles avec Windows Search sur Windows XP et Windows Server 2003 et versions ultérieures.

Pour plus d’informations sur l’utilisation de la syntaxe SQL de recherche Windows, consultez Interroger l’index avec Windows syntaxe SQL de recherche et vue d’ensemble de Windows syntaxe de recherche SQL.

Les approches suivantes pour interroger l’index sont SQL basées.

Utilisation d’OLE DB

La base de données OLE DB (Object Linking and Embedding Database) est une API COM (Component Object Model) qui vous permet d’accéder à différents types de magasins de données de manière uniforme, y compris des bases de données non relationnelles comme des feuilles de calcul. OLE DB sépare le magasin de données de l’application qui y accède via un ensemble d’abstractions qui incluent la source de données, la session, la commande et les ensembles de lignes Shell. Un fournisseur OLE DB est un composant logiciel qui implémente l’interface OLE DB pour fournir des données aux applications à partir d’un magasin de données particulier.

Vous pouvez accéder au fournisseur OLE DB de recherche Windows par programmation à l’aide des objets OleDbConnection et OleDbSession en C# et à l’aide de la prise en charge OLE DB intégrée à la bibliothèque de modèles active (ATL) en C++ (via atlclidb.h). La seule propriété à définir est la chaîne de fournisseur.

Vous pouvez utiliser la chaîne suivante :

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

Vous pouvez également obtenir la chaîne de connexion en appelant ISearchQueryHelper::get_ConnectionString. Pour obtenir un exemple, consultez Utilisation d’ISearchQueryHelper .

Notes

Le fournisseur OLE DB de recherche Windows est en lecture seule et prend en charge les instructions SELECT et GROUP ON. Les instructions INSERT et DELETE ne sont pas prises en charge.

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

Pour plus d’informations sur OLE DB, consultez vue d’ensemble de la programmation OLE DB. Pour plus d’informations sur le .NET Framework Fournisseur de données pour OLE DB, consultez la documentation de l’espace de noms System.Data.OleDb.

Utilisation d’ADO et de ADO.NET

Microsoft ActiveX Data Objects (ADO) et ADO.NET vous permettent d’écrire des applications clientes pour accéder aux données et les manipuler dans un serveur de base de données via un fournisseur. Windows Search est une technologie en lecture seule : vous pouvez récupérer des données à l’aide de la recherche de bureau, mais vous ne pouvez pas modifier les données à l’aide de Windows Search. Toutefois, vous pouvez transmettre les résultats d’une recherche à une technologie qui peut modifier les données.

Les exemples de code suivants montrent comment ouvrir une connexion à la source de données, créer et ouvrir un RecordSet avec une instruction Windows Search SQL SELECT et obtenir les URL des cinq fichiers les plus volumineux à partir de l’index.

Notes

Pour plus d’informations sur l’obtention de la chaîne de connexion, consultez Interroger l’index avec ISearchQueryHelper et ISearchQueryHelper::get_Connection String.

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

Tout d’abord, ajoutez une référence à ADODB dans votre projet

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

Utilisation de SQL dans les requêtes locales et distantes

Vous pouvez exécuter vos requêtes localement ou à distance. Une requête locale utilisant la clause FROM est illustrée dans l’exemple suivant. Une requête locale interroge uniquement le catalogue SystemIndex local.

FROM SystemIndex

Une requête distante utilisant la clause FROM est illustrée dans l’exemple suivant. L’ajout de ComputerName transforme l’exemple précédent en requête distante.

FROM [<ComputerName>.]SystemIndex

Par défaut, Windows XP et Windows Server 2003 n’ont pas Windows Recherche installée. Seul Windows Search 4 (WS4) fournit la prise en charge des requêtes à distance. Les versions précédentes de Windows Desktop Search (WDS), telles que 3.01 et versions antérieures, ne prennent pas en charge l’interrogation à distance. Avec Windows Explorer, vous pouvez interroger l’index local d’un ordinateur distant pour les éléments du système de fichiers (éléments gérés par le protocole « file: »).

Pour récupérer un élément par requête distante, l’élément doit répondre aux exigences suivantes :

  • Être accessible via le chemin UNC (Universal Naming Convention).
  • Existe sur l’ordinateur distant auquel le client a accès.
  • Définissez sa sécurité pour permettre au client d’avoir un accès en lecture.

Windows Explorer propose des fonctionnalités de partage d’éléments, notamment un partage « public » (\\Machine\Public\...) dans le Centre de partage et de réseau, ainsi qu’un partage « Utilisateurs » (\\Machine\Users\...) pour les éléments partagés via l’Assistant Partage. Après avoir partagé le ou les dossiers, vous pouvez interroger l’index local en spécifiant le nom de l’ordinateur distant dans la clause FROM et un chemin UNC sur l’ordinateur distant dans la clause SCOPE, comme illustré dans l’exemple suivant :

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

Requêtes basées sur AQS

AQS est la syntaxe de requête par défaut utilisée par Windows Search pour interroger l’index et affiner les paramètres de recherche. Bien qu’AQS soit principalement accessible par l’utilisateur, il peut être utilisé par les développeurs pour générer des requêtes par programmation. Dans Windows 7 AQS canonique a été introduit et doit être utilisé dans Windows 7 et versions ultérieures, pour générer des requêtes AQS par programmation. Pour plus d’informations sur AQS, consultez Utilisation de la syntaxe de requête avancée par programmation.

Les approches suivantes pour interroger l’index sont basées sur AQS.

Utilisation de ISearchQueryHelper

Vous pouvez développer un composant ou une classe d’assistance pour interroger l’index à l’aide de l’interface ISearchQueryHelper, ce qui vous permet de tirer parti de certaines fonctionnalités du système et de simplifier votre utilisation de Windows Search. Cette interface vous aide à :

  • Obtenez une chaîne de connexion OLE DB pour vous connecter à la base de données de recherche Windows.
  • Convertissez les requêtes utilisateur d’AQS en Windows Search SQL.

Cette interface est implémentée en tant que classe d’assistance pour ISearchCatalogManager et est obtenue en appelant ISearchCatalogManager::GetQueryHelper, comme illustré dans l’exemple C++ suivant.

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

Pour implémenter l’interface ISearchQueryHelper , consultez Utilisation de l’interface ISearchQueryHelper et de la rubrique de référence ISearchQueryHelper .

Notes

Compatibilité héritée de Microsoft Windows Desktop Search (WDS) 2x : sur les ordinateurs exécutant Windows XP et Windows Server 2003 et versions ultérieures, ISearchDesktop est déconseillé. Au lieu de cela, les développeurs doivent utiliser ISearchQueryHelper pour obtenir une chaîne de connexion, analyser la requête de l’utilisateur dans SQL, puis interroger via OLE DB.

Utilisation du protocole search-ms

Le protocole d’applicationsearch-ms est une convention de démarrage d’une application, comme Windows Explorer, pour interroger l’index de recherche Windows. Il permet de créer des requêtes avec des arguments de valeur de paramètre, notamment des arguments de propriété, des recherches enregistrées précédemment, une syntaxe de requête avancée (AQS), une syntaxe de requête naturelle (NQS) et des identificateurs de code de langage (LCID) pour l’indexeur et la requête elle-même.

Pour plus d’informations sur la syntaxe du protocole search-ms, consultez Interroger l’index avec le protocole search-ms.

Interrogation de l’index programmatiquement

Interrogation de l’index avec ISearchQueryHelper

Interrogation de l’index avec le protocole search-ms

Interrogation de l’index avec Windows syntaxe de recherche SQL

Utilisation de la syntaxe de requête avancée par programmation