Utilisation des approches SQL et AQS pour interroger l’index

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

Cette rubrique est organisée comme suit :

Requêtes basées sur SQL

SQL est un langage de texte qui définit les requêtes. SQL est courant dans de nombreuses technologies de base de données différentes. Recherche Windows 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 Recherche Windows étend des parties de la syntaxe de requête de base de données SQL-92 et SQL-99 standard pour améliorer son utilité avec les recherches textuelles. Toutes les fonctionnalités de Windows Search SQL 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 Interrogation de l’index avec la syntaxe SQL de Recherche Windows et Vue d’ensemble de la syntaxe SQL de Recherche Windows.

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 uniformément à différents types de magasins de données, y compris les bases de données non relationnelles comme les 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 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 Recherche Windows par programmation à l’aide des objets OleDbConnection et OleDbSession en C# et en utilisant la prise en charge OLE DB intégrée à la bibliothèque de modèles actifs (ATL) dans C++ (via atlclidb.h). La seule propriété à définir est la chaîne du 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 fournisseur de données .NET Framework 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 et manipuler des données dans un serveur de base de données via un fournisseur. Recherche Windows est une technologie en lecture seule : vous pouvez récupérer des données à l’aide de La recherche sur le bureau, mais vous ne pouvez pas modifier les données à l’aide de Recherche Windows. 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 plus grands fichiers à partir de l’index.

Notes

Pour plus d’informations sur l’obtention de la chaîne de connexion, consultez Interrogation de 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

Commencez par ajouter 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 Search installé. Seul Windows Search 4 (WS4) prend en charge les requêtes à distance. Les versions précédentes de Recherche de bureau Windows (WDS), telles que les versions 3.01 et 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 d’accès UNC (Universal Naming Convention).
  • Existe sur l’ordinateur distant auquel le client a accès.
  • Avoir sa sécurité définie pour autoriser le client à disposer d’un accès en lecture.

Windows Explorer dispose de fonctionnalités de partage d’éléments, notamment un partage « Public » (\\Machine\Public\...) dans le Centre réseau et partage, et un partage « Utilisateurs » (\\Machine\Users\...) pour les éléments partagés via l’Assistant Partage. Après avoir partagé 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 Recherche Windows pour interroger l’index et affiner et affiner les paramètres de recherche. Bien qu’AQS soit principalement destiné aux utilisateurs, il peut être utilisé par les développeurs pour créer 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 par programmation des requêtes AQS. 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 d’ISearchQueryHelper

Vous pouvez développer un composant ou une classe d’assistance pour interroger l’index à l’aide de l’interface ISearchQueryHelper , 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 Recherche Windows.
  • Convertissez des requêtes utilisateur d’AQS en SQL Recherche Windows.

Cette interface est implémentée en tant que classe d’assistance dans 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é 2x de La Recherche de bureau Microsoft Windows (WDS) héritée : 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 permettant de démarrer une application, comme Windows Explorer, pour interroger l’index 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 précédemment enregistrées, 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 Interrogation de 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 Recherche Windows

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