Bagikan melalui


Menggunakan Pendekatan SQL dan AQS untuk Mengkueri Indeks

Ada beberapa cara untuk menggunakan Windows Search untuk mengkueri indeks. Topik ini menguraikan pendekatan berbasis Advanced Query Syntax (AQS) dan Bahasa Permintaan Terstruktur (SQL).

Topik ini diatur sebagai berikut:

Kueri Berbasis SQL

SQL adalah bahasa teks yang menentukan kueri. SQL umum di berbagai teknologi database. Windows Search menggunakan SQL, mengimplementasikan subsetnya, dan memperluasnya dengan menambahkan elemen ke bahasa. Windows Search SQL yang digunakan oleh Windows Search memperluas bagian sintaks kueri database SQL-92 dan SQL-99 standar untuk meningkatkan kegunaannya dengan pencarian berbasis teks. Semua fitur Windows Search SQL kompatibel dengan Windows Search di Windows XP dan Windows Server 2003, dan yang lebih baru.

Untuk informasi selengkapnya tentang menggunakan sintaks Windows Search SQL, lihat Mengkueri Indeks dengan Sintaks SQL Pencarian Windows dan Gambaran Umum Sintaks SQL Pencarian Windows.

Pendekatan berikut untuk mengkueri indeks berbasis SQL.

Menggunakan OLE DB

Object Linking and Embedding Database (OLE DB) adalah API Model Objek Komponen (COM) yang memungkinkan Anda mengakses berbagai jenis penyimpanan data secara seragam, termasuk database non-relasional seperti spreadsheet. OLE DB memisahkan penyimpanan data dari aplikasi yang mengaksesnya melalui serangkaian abstraksi yang mencakup sumber data Shell, sesi, perintah, dan himpunan baris. Penyedia OLE DB adalah komponen perangkat lunak yang mengimplementasikan antarmuka OLE DB untuk menyediakan data ke aplikasi dari penyimpanan data tertentu.

Anda dapat mengakses penyedia Windows Search OLE DB secara terprogram dengan menggunakan objek OleDbConnection dan OleDbSession di C# dan dengan menggunakan dukungan OLE DB yang disertakan dalam Pustaka Templat Aktif (ATL) di C++ (melalui atlclidb.h). Satu-satunya properti yang harus diatur adalah string penyedia.

Anda dapat menggunakan string berikut:

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

Atau, Anda bisa mendapatkan string koneksi dengan memanggil ISearchQueryHelper::get_ConnectionString. Lihat Menggunakan ISearchQueryHelper misalnya.

Catatan

Penyedia Windows Search OLE DB bersifat baca-saja, dan mendukung pernyataan SELECT dan GROUP ON. Pernyataan INSERT dan DELETE tidak didukung.

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

Untuk informasi selengkapnya tentang OLE DB, lihat Gambaran Umum Pemrograman OLE DB. Untuk informasi tentang Penyedia Data .NET Framework untuk OLE DB, lihat dokumentasi Namespace Layanan System.Data.OleDb.

Menggunakan ADO dan ADO.NET

Microsoft ActiveX Data Objects (ADO) dan ADO.NET memungkinkan Anda menulis aplikasi klien untuk mengakses dan memanipulasi data di server database melalui penyedia. Windows Search adalah teknologi baca-saja: Anda dapat mengambil data menggunakan Pencarian Desktop tetapi Anda tidak dapat mengubah data menggunakan Windows Search. Namun, Anda dapat meneruskan hasil pencarian ke teknologi yang dapat mengubah data.

Contoh kode berikut menunjukkan cara membuka koneksi ke sumber data, membuat dan membuka RecordSet dengan pernyataan Windows Search SQL SELECT, dan mendapatkan URL dari lima file terbesar dari indeks.

Catatan

Untuk informasi tentang cara mendapatkan string koneksi, lihat Mengkueri Indeks dengan ISearchQueryHelper, dan ISearchQueryHelper::get_Connection String.

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

Pertama-tama tambahkan referensi ke ADODB di proyek Anda

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

Menggunakan SQL di Kueri Lokal dan Jarak Jauh

Anda dapat menjalankan kueri baik secara lokal maupun jarak jauh. Kueri lokal yang menggunakan klausa FROM diperlihatkan dalam contoh berikut. Kueri lokal hanya mengkueri katalog SystemIndex lokal.

FROM SystemIndex

Kueri jarak jauh menggunakan klausa FROM diperlihatkan dalam contoh berikut. Menambahkan ComputerName mengubah contoh sebelumnya menjadi kueri jarak jauh.

FROM [<ComputerName>.]SystemIndex

Secara default, Windows XP dan Windows Server 2003 tidak menginstal Windows Search. Hanya Windows Search 4 (WS4) yang menyediakan dukungan kueri jarak jauh. Versi Windows Desktop Search (WDS) sebelumnya, seperti 3.01 dan yang lebih lama, tidak mendukung kueri jarak jauh. Dengan Windows Explorer Anda dapat mengkueri indeks lokal komputer jarak jauh untuk item sistem file (item yang ditangani oleh protokol "file:").

Untuk mengambil item dengan kueri jarak jauh, item harus memenuhi persyaratan berikut:

  • Dapat diakses melalui jalur Universal Naming Convention (UNC).
  • Ada pada komputer jarak jauh yang dapat diakses klien.
  • Atur keamanannya untuk memungkinkan klien memiliki akses Baca.

Windows Explorer memiliki fitur untuk berbagi item termasuk berbagi "Publik" (\\Machine\Public\...) di Pusat Jaringan dan Berbagi, dan berbagi "Pengguna" (\\Machine\Users\...) untuk item yang dibagikan melalui Wizard Berbagi. Setelah berbagi folder, Anda dapat mengkueri indeks lokal dengan menentukan nama komputer komputer jarak jauh dalam klausa FROM, dan jalur UNC pada komputer jarak jauh dalam klausa SCOPE, seperti yang ditunjukkan dalam contoh berikut:

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

Kueri Berbasis AQS

AQS adalah sintaks kueri default yang digunakan oleh Windows Search untuk mengkueri indeks dan untuk memperbaiki dan mempersempit parameter pencarian. Meskipun AQS terutama dihadapi pengguna, AQS dapat digunakan oleh pengembang untuk membangun kueri secara terprogram. Di Windows 7 canonical AQS diperkenalkan, dan harus digunakan di Windows 7 dan yang lebih baru, untuk menghasilkan kueri AQS secara terprogram. Untuk informasi terperinci tentang AQS, lihat Menggunakan SintaksIs Kueri Tingkat Lanjut Secara Terprogram.

Pendekatan berikut untuk mengkueri indeks berbasis AQS.

Menggunakan ISearchQueryHelper

Anda dapat mengembangkan kelas komponen atau pembantu untuk mengkueri indeks dengan menggunakan antarmuka ISearchQueryHelper , yang memungkinkan Anda memanfaatkan beberapa fitur sistem dan menyederhanakan penggunaan Windows Search. Antarmuka ini membantu Anda:

  • Dapatkan string koneksi OLE DB untuk menyambungkan ke database Windows Search.
  • Mengonversi kueri pengguna dari AQS ke Windows Search SQL.

Antarmuka ini diimplementasikan sebagai kelas pembantu untuk ISearchCatalogManager dan diperoleh dengan memanggil ISearchCatalogManager::GetQueryHelper, seperti yang ditunjukkan dalam contoh C++berikut.

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

Untuk mengimplementasikan antarmuka ISearchQueryHelper , lihat Menggunakan antarmuka ISearchQueryHelper dan topik referensi ISearchQueryHelper .

Catatan

Kompatibilitas 2x Microsoft Windows Desktop Search (WDS) warisan: Pada komputer yang menjalankan Windows XP dan Windows Server 2003 dan yang lebih baru, ISearchDesktop tidak digunakan lagi. Sebagai gantinya, pengembang harus menggunakan ISearchQueryHelper untuk mendapatkan string koneksi, mengurai kueri pengguna ke SQL, lalu mengkueri melalui OLE DB.

Menggunakan Protokol search-ms

Protokol aplikasisearch-ms adalah konvensi untuk memulai aplikasi, seperti Windows Explorer, untuk mengkueri indeks Windows Search. Ini memungkinkan kueri dibangun dengan argumen nilai parameter, termasuk argumen properti, pencarian yang disimpan sebelumnya, Sintaks Kueri Tingkat Lanjut (AQS), Sintaks Kueri Alami (NQS), dan pengidentifikasi kode bahasa (LCID) untuk pengindeks dan kueri itu sendiri.

Untuk informasi terperinci tentang sintaks protokol search-ms, lihat Mengkueri Indeks dengan Protokol search-ms.

Mengkueri Indeks Secara Terprogram

Mengkueri Indeks dengan ISearchQueryHelper

Mengkueri Indeks dengan Protokol search-ms

Mengkueri Indeks dengan Sintaks SQL Pencarian Windows

Menggunakan Sintaks Kueri Tingkat Lanjut Secara Terprogram