Partager via


Utilisation des approches SQL et AQS pour interroger l’index

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

Cette rubrique est organisée comme suit :

Requêtes basées sur le langage SQL

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

Pour en savoir plus sur l’utilisation de la syntaxe Windows Search SQL, consultez Interroger l’index avec la syntaxe Windows Search SQL et Vue d’ensemble de la syntaxe Windows Search SQL.

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

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 de manière uniforme à différents types de magasins de données, y compris des bases de données non relationnelles telles que des feuilles de calcul. OLE DB sépare le magasin de données de l’application qui y accède au moyen d’un ensemble d’abstractions comprenant la source de données Shell, la session, la commande et les ensembles de lignes. 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 Windows Search 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 actifs (ATL) en C++ (via atlclidb.h). La seule propriété à définir est la chaîne de fournisseur.

Vous pouvez utiliser la chaîne ci-dessous :

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

Vous pouvez également obtenir le chaîne de connexion en appelant ISearchQueryHelper::get_ConnectionString. Consultez utilisation de ISearchQueryHelper pour obtenir un exemple.

Remarque

Le fournisseur OLE DB de Windows Search 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 en savoir plus sur OLE DB, consultez Vue d’ensemble de la programmation OLE DB. Pour obtenir des informations sur le fournisseur de données .NET Framework pour OLE DB, consultez la documentation de System.Data.OleDb Namespace.

Utilisation d’ADO et d’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 Desktop Search, 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 Jeu d’enregistrements avec une instruction Windows Search SQL SELECT, et obtenir les URL des cinq fichiers les plus volumineux à partir de l’index.

Remarque

Pour en savoir plus 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

Dans votre projet, ajoutez d’abord une référence à ADODB.

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 du langage SQL dans des 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 une requête distante.

FROM [<ComputerName>.]SystemIndex

Par défaut, Windows XP et Windows Server 2003 n’ont pas installé Windows Search. Seul Windows Search 4 (WS4) fournit la prise en charge des requêtes distantes. Les versions antérieures de Windows Desktop Search (WDS), telles que la version 3.01 et les versions antérieures, ne prennent pas en charge l’interrogation à distance. Avec l’explorateur Windows, 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, il doit répondre aux exigences suivantes :

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

L’explorateur Windows offre 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\Utilisateurs\...) pour les éléments partagés via l’Assistant de partage. Après avoir partagé le(s) dossier(s), 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 le langage 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 destiné à l’utilisateur, il peut être utilisé par les développeurs pour élaborer des requêtes par programmation. L’AQS canonique a été introduite dans Windows 7 et doit être utilisé dans Windows 7 et les versions ultérieures pour générer des requêtes AQS par programmation. Pour en savoir plus 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 d’ISearchQueryHelper

Vous pouvez développer une classe de composant ou d’aide 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 à :

  • Obtenir un chaîne de connexion OLE DB pour vous connecter à la base de données Windows Search.
  • Convertir les requêtes utilisateur d’AQS en SQL De Windows Search.

Cette interface est implémentée en tant que classe d’aide 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.

Remarque

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

Utilisation du protocole search-ms

Le protocole d’application search-ms est une convention de démarrage d’une application, comme l’explorateur Windows, pour interroger l’index Windows Search. Il permet de générer 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 en savoir plus 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 la syntaxe SQL de Windows Search

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