Поделиться через


Использование подходов SQL и AQS для запроса индекса

Существует несколько способов использования поиска Windows для запроса индекса. В этом разделе описаны подходы на основе расширенного синтаксиса запросов (AQS) и язык SQL (SQL).

Этот раздел организован следующим образом:

Запросы на основе SQL

SQL — это текстовый язык, определяющий запросы. SQL распространен во многих различных технологиях базы данных. Поиск Windows использует SQL, реализует подмножество и расширяет его путем добавления элементов на язык. SQL поиска Windows, используемый в службе поиска Windows, расширяет части стандартного синтаксиса запросов к базе данных SQL-92 и SQL-99, чтобы повысить его полезность с помощью текстовых поисков. Все функции SQL поиска Windows совместимы с Windows Search в Windows XP и Windows Server 2003 и более поздних версий.

Дополнительные сведения об использовании синтаксиса SQL поиска Windows см. в статье "Запрос индекса с помощью синтаксиса SQL поиска Windows" и "Обзор синтаксиса SQL поиска Windows".

Ниже приведены подходы к запросу индекса на основе SQL.

Использование OLE DB

Связывание объектов и внедрение базы данных (OLE DB) — это API объектной модели компонентов (COM), который позволяет получать доступ к различным типам хранилищ данных равномерно, включая нереляционные базы данных, такие как электронные таблицы. OLE DB отделяет хранилище данных от приложения, доступ к нему с помощью набора абстракций, включающих источник данных оболочки, сеанс, команды и наборы строк. Поставщик OLE DB — это программный компонент, реализующий интерфейс OLE DB для предоставления данных приложениям из определенного хранилища данных.

Вы можете получить доступ к поставщику OLE DB для поиска Windows программным способом с помощью объектов OleDbConnection и OleDbSession в C# и с помощью поддержки OLE DB, встроенной в библиотеку active Template Library (ATL) в C++ (через atlclidb.h). Единственным свойством, которое необходимо задать, является строка поставщика.

Можно использовать следующую строку:

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

Кроме того, вы можете получить строка подключения, вызвав ISearchQueryHelper::get_ConnectionString. См. пример использования ISearchQueryHelper .

Примечание.

Поставщик OLE DB для поиска Windows доступен только для чтения и поддерживает инструкции SELECT и GROUP ON. Инструкции INSERT и DELETE не поддерживаются.

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

Дополнительные сведения о OLE DB см. в разделе "Обзор программирования OLE DB". Сведения о поставщике данных платформа .NET Framework для OLE DB см. в документации по пространству имен System.Data.OleDb.

Использование ADO и ADO.NET

Объекты данных Microsoft ActiveX (ADO) и ADO.NET позволяют создавать клиентские приложения для доступа к данным на сервере базы данных и управления ими через поставщика. Поиск Windows — это технология только для чтения: вы можете получить данные с помощью поиска на рабочем столе, но изменить данные с помощью поиска Windows нельзя. Однако вы можете передать результаты поиска в технологию, которая может изменять данные.

В следующих примерах кода показано, как открыть подключение к источнику данных, создать и открыть Набор записей с помощью инструкции WINDOWS Search SQL SELECT и получить URL-адреса пяти крупнейших файлов из индекса.

Примечание.

Сведения о том, как получить строка подключения, см. в статье "Запрос индекса" с помощью ISearchQueryHelper и ISearchQueryHelper::get_Connection String.

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

Сначала добавьте ссылку на 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 и 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();
    }
}

Использование SQL в локальных и удаленных запросах

Запросы можно выполнять локально или удаленно. Локальный запрос с помощью предложения FROM показан в следующем примере. Локальный запрос запрашивает только локальный каталог SystemIndex.

FROM SystemIndex

Удаленный запрос с помощью предложения FROM показан в следующем примере. Добавление ComputerName преобразует предыдущий пример в удаленный запрос.

FROM [<ComputerName>.]SystemIndex

По умолчанию Windows XP и Windows Server 2003 не установлены в службе поиска Windows. Только Windows Search 4 (WS4) обеспечивает поддержку удаленных запросов. Предыдущие версии поиска на рабочем столе Windows (WDS), например 3.01 и более ранних версий, не поддерживают удаленные запросы. В проводнике Windows можно запросить локальный индекс удаленного компьютера для элементов файловой системы (элементы, обрабатываемые протоколом file:).

Чтобы получить элемент по удаленному запросу, элемент должен соответствовать следующим требованиям:

  • Быть доступным через UNC-путь.
  • Существует на удаленном компьютере, к которому имеется доступ клиента.
  • Установите его набор безопасности, чтобы разрешить клиенту доступ на чтение.

В проводнике Windows есть функции для общего доступа к элементам, включая общий ресурс (\\Machine\Public\...) в Центре управления сетями и общим доступом , а также общий ресурс "Пользователи" (\\Machine\Users\...) для элементов, которыми предоставлен общий доступ с помощью мастера общего доступа. После совместного использования папок можно запросить локальный индекс, указав имя компьютера удаленного компьютера в предложении FROM и UNC-путь на удаленном компьютере в предложении SCOPE, как показано в следующем примере:

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

Запросы на основе AQS

AQS — это синтаксис запросов по умолчанию, используемый поиском Windows для запроса индекса и уточнения и узких параметров поиска. Хотя AQS в основном сталкивается с пользователем, он может использоваться разработчиками для создания запросов программным способом. В Windows 7 появилась каноническая AQS и должна использоваться в Windows 7 и более поздних версиях для программного создания запросов AQS. Подробные сведения об AQS см. в статье "Использование расширенного синтаксиса запросов программным способом".

Ниже приведены подходы к запросу индекса на основе AQS.

Использование ISearchQueryHelper

Вы можете разработать компонент или вспомогательный класс для запроса индекса с помощью интерфейса ISearchQueryHelper , который позволяет воспользоваться преимуществами некоторых функций системы и упростить использование поиска Windows. Этот интерфейс поможет вам:

  • Получите строка подключения OLE DB для подключения к базе данных поиска Windows.
  • Преобразуйте запросы пользователей из AQS в WINDOWS Search SQL.

Этот интерфейс реализуется как вспомогательный класс для ISearchCatalogManager и получается путем вызова ISearchCatalogManager::GetQueryHelper, как показано в следующем примере 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;
}

Сведения о реализации интерфейса ISearchQueryHelper см. в разделе "Использование интерфейса ISearchQueryHelper" и справочного раздела ISearchQueryHelper.

Примечание.

Устаревшая совместимость с microsoft Windows Desktop Search (WDS) 2x: на компьютерах под управлением Windows XP и Windows Server 2003 и более поздних версий ISearchDesktop не рекомендуется. Вместо этого разработчики должны использовать ISearchQueryHelper, чтобы получить строка подключения, проанализировать запрос пользователя в SQL, а затем выполнить запрос с помощью OLE DB.

Использование протокола search-ms

Протокол приложения search-ms — это соглашение о запуске приложения, например проводника Windows, для запроса индекса поиска Windows. Он позволяет создавать запросы с аргументами значения параметров, включая аргументы свойств, ранее сохраненные поиски, расширенный синтаксис запросов (AQS), синтаксис естественного запроса (NQS) и идентификаторы кода языка (LCID) для индексатора и самого запроса.

Подробные сведения о синтаксисе протокола search-ms см. в статье "Запрос индекса" с помощью протокола search-ms.

Отправка программных запросов к индексу

Запрос индекса с помощью ISearchQueryHelper

Запрос индекса с помощью протокола search-ms

Запрос индекса с помощью синтаксиса SQL поиска Windows

Использование расширенного синтаксиса запросов программным способом