Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Istnieje kilka sposobów używania usługi Windows Search do wykonywania zapytań dotyczących indeksu. W tym temacie opisano metody oparte na języku Advanced Query Syntax (AQS) i Structured Query Language (SQL).
Ten temat jest zorganizowany w następujący sposób:
Zapytania oparte na języku SQL
SQL to język tekstowy, który definiuje zapytania. Język SQL jest często spotykany w wielu różnych technologiach baz danych. Usługa Windows Search używa języka SQL, implementuje jego podzbiór i rozszerza go przez dodanie elementów do języka. Język SQL usługi Windows Search używany przez usługę Windows Search rozszerza fragmenty standardowej składni zapytań bazy danych SQL-92 i SQL-99, aby zwiększyć jej użyteczność dzięki wyszukiwaniom opartym na tekście. Wszystkie funkcje usługi Windows Search SQL są zgodne z usługą Windows Search w systemach Windows XP i Windows Server 2003 i nowszych.
Aby uzyskać więcej informacji na temat używania składni SQL usługi Windows Search, zobacz Zapytania do indeksu za pomocą składni SQL usługi Windows Search i Przegląd składni SQL usługi Windows Search.
Poniższe podejścia do wykonywania zapytań względem indeksu są oparte na języku SQL.
Korzystanie z bazy danych OLE DB
Łączenie obiektów i osadzanie bazy danych (OLE DB) to interfejs API modelu obiektów składników (COM), który umożliwia jednolity dostęp do różnych typów magazynów danych, w tym nierelacyjnych baz danych, takich jak arkusze kalkulacyjne. OLE DB oddziela magazyn danych od aplikacji uzyskującej do niego dostęp poprzez zestaw abstrakcji, które obejmują źródło danych powłoki, sesję, polecenie i zestawy wierszy. Dostawca OLE DB to składnik oprogramowania, który implementuje interfejs OLE DB w celu dostarczania danych aplikacjom z określonego magazynu danych.
Dostęp do dostawcy OLE DB usługi Windows Search można uzyskać programowo przy użyciu obiektów OleDbConnection i OleDbSession w języku C# oraz przy użyciu obsługi OLE DB wbudowanej w bibliotekę Active Template Library (ATL) w języku C++ (za pośrednictwem atlclidb.h). Jedyną właściwością, której ustawienie jest wymagane, jest ciąg dostawcy.
Możesz użyć następującego ciągu:
provider=Search.CollatorDSO;EXTENDED PROPERTIES="Application=Windows"
Możesz też uzyskać parametry połączenia, wywołując metodę ISearchQueryHelper::get_ConnectionString. Zobacz przykład użycia ISearchQueryHelper.
Uwaga / Notatka
Dostawca OLE DB usługi Windows Search jest tylko do odczytu i obsługuje instrukcje SELECT i GROUP ON. Instrukcje INSERT i DELETE nie są obsługiwane.
#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();
}
}
}
Aby uzyskać więcej informacji na temat OLE DB, zobacz Omówienie programowania OLE DB. Aby uzyskać informacje na temat dostawcy danych programu .NET Framework dla OLE DB, przeczytaj dokumentację przestrzeni nazw System.Data.OleDb.
Używanie platformy ADO i ADO.net
Microsoft ActiveX Data Objects (ADO) i ADO.NET umożliwiają pisanie aplikacji klienckich w celu uzyskiwania dostępu do danych i manipulowania nimi na serwerze bazy danych za pośrednictwem dostawcy. Windows Search to technologia tylko do odczytu: dane można pobierać przy użyciu funkcji Wyszukiwania pulpitu, ale nie można zmieniać danych przy użyciu usługi Windows Search. Możesz jednak przekazać wyniki wyszukiwania do technologii, która może zmieniać dane.
W poniższych przykładach kodu pokazano, jak otworzyć połączenie ze źródłem danych, utworzyć i otworzyć zestaw rekordów za pomocą instrukcji SELECT języka SQL usługi Windows Search i uzyskać adresy URL pięciu największych plików z indeksu.
Uwaga / Notatka
Aby uzyskać informacje na temat uzyskiwania ciągu połączenia, zobacz Querying the Index with ISearchQueryHelper i ISearchQueryHelper::get_ConnectionString.
ADO i 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 i 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 i VisualBasic
Najpierw dodaj odwołanie do bazy danych ADODB w projekcie
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 i 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();
}
}
Używanie języka SQL w zapytaniach lokalnych i zdalnych
Zapytania można wykonywać lokalnie lub zdalnie. W poniższym przykładzie pokazano zapytanie lokalne używające klauzuli FROM . Zapytanie lokalne wysyła zapytanie tylko do lokalnego katalogu SystemIndex.
FROM SystemIndex
Zapytanie zdalne używające klauzuli FROM jest pokazane w poniższym przykładzie. Dodanie parametru ComputerName przekształca poprzedni przykład w zapytanie zdalne.
FROM [<ComputerName>.]SystemIndex
Domyślnie systemy Windows XP i Windows Server 2003 nie mają zainstalowanej usługi Windows Search. Tylko usługa Windows Search 4 (WS4) zapewnia obsługę zapytań zdalnych. Poprzednie wersje usługi Windows Desktop Search (WDS), takie jak 3.01 i starsze, nie obsługują zapytań zdalnych. Za pomocą Eksploratora Windows można wykonywać zapytania dotyczące lokalnego indeksu komputera zdalnego dla elementów systemu plików (elementy obsługiwane przez protokół "file:").
Aby pobrać element za pomocą zapytania zdalnego, element musi spełniać następujące wymagania:
- Być dostępny za pośrednictwem ścieżki UNC (Universal Naming Convention).
- Istnieje na komputerze zdalnym, do którego klient ma dostęp.
- Ustaw zabezpieczenia, aby umożliwić klientowi dostęp do odczytu.
Eksplorator Windows posiada funkcje udostępniania elementów, w tym udział "Publiczny" (\\Machine\Public\...) w Centrum sieci i udostępniania oraz udział "Użytkownicy" (\\Machine\Users\...) dla elementów udostępnionych za pomocą Kreatora udostępniania. Po udostępnieniu folderów można wykonać zapytanie względem indeksu lokalnego, określając nazwę komputera zdalnego w klauzuli FROM oraz ścieżkę UNC na maszynie zdalnej w klauzuli SCOPE, jak pokazano w poniższym przykładzie:
SELECT System.ItemName FROM MachineName.SystemIndex WHERE SCOPE='file://MachineName/<path>'
Zapytania oparte na AQS
AQS to domyślna składnia zapytania używana przez usługę Windows Search do wykonywania zapytań względem indeksu oraz do uściślinia i zawężenia parametrów wyszukiwania. Podczas gdy AQS jest przede wszystkim skierowany do użytkowników, może być używany przez deweloperów do tworzenia zapytań programistycznie. W systemie Windows 7 wprowadzono kanoniczny AQS, który musi być używany w systemie Windows 7 i nowszych do programowego generowania zapytań AQS. Aby uzyskać szczegółowe informacje na temat AQS, zobacz Using Advanced Query Syntax Programmatically (Używanie zaawansowanej składni zapytań programowo).
Poniższe podejścia do wykonywania zapytań względem indeksu są oparte na AQS.
Korzystanie z elementu ISearchQueryHelper
Możesz opracować składnik lub klasę pomocnika w celu wykonywania zapytań dotyczących indeksu przy użyciu interfejsu ISearchQueryHelper , który umożliwia korzystanie z niektórych funkcji systemu i upraszcza korzystanie z usługi Windows Search. Ten interfejs ułatwia:
- Uzyskaj parametry połączenia OLE DB, aby nawiązać połączenie z bazą danych usługi Windows Search.
- Konwertowanie zapytań użytkowników z AQS na sql usługi Windows Search.
Ten interfejs jest implementowany jako klasa pomocnika dla klasy ISearchCatalogManager i jest uzyskiwany przez wywołanie metody ISearchCatalogManager::GetQueryHelper, jak pokazano w poniższym przykładzie języka C++.
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;
}
Aby zaimplementować interfejs
Uwaga / Notatka
Zgodność starszej wersji programu Microsoft Windows Desktop Search (WDS) 2x: na komputerach z systemem Windows XP i Windows Server 2003 lub nowszym ISearchDesktop jest niezalecane. Zamiast tego deweloperzy powinni użyć interfejsu ISearchQueryHelper , aby uzyskać parametry połączenia, przeanalizować zapytanie użytkownika do języka SQL, a następnie wykonać zapytanie za pomocą ole DB.
Korzystanie z protokołu search-ms
Protokół aplikacjisearch-ms jest konwencją uruchamiania aplikacji, takiej jak Eksplorator Windows, do wykonywania zapytań względem indeksu usługi Windows Search. Umożliwia ona tworzenie zapytań przy użyciu argumentów wartości parametrów, w tym argumentów właściwości, wcześniej zapisanych wyszukiwań, zaawansowanej składni zapytań (AQS), składni naturalnej kwerendy (NQS) i identyfikatorów kodu języka (LCID) zarówno dla indeksatora, jak i samego zapytania.
Aby uzyskać szczegółowe informacje na temat składni protokołu search-ms, zobacz Querying the Index with the search-ms Protocol (Wykonywanie zapytań względem indeksu przy użyciu protokołu search-ms).