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


Разработка надстроек IFilter

Примечание

Windows Desktop Search 2.x — это устаревшая технология, которая изначально была доступна в качестве надстройки для Windows XP и Windows Server 2003. В более поздних выпусках используйте Windows Search .

Вы можете расширить поиск microsoft Windows Desktop Search (WDS) с помощью надстроек фильтрации, компонентов, реализующих интерфейс IFilter, чтобы включить новые типы файлов. Фильтры отвечают за доступ к данным в файлах и их анализ, а также за возврат пар свойств и значений, а также фрагментов текста для индексирования. В процессе индексирования служба WDS вызывает соответствующий фильтр с URL-адресом для каждого файла или элемента. Фильтр сначала извлекает метаданные, соответствующие свойствам, помеченным как доступные для извлечения в схеме WDS, такие как заголовок, размер файла и дата последнего изменения. Затем содержимое элемента разбивается на фрагменты текста. WDS добавляет свойства и текст, возвращаемые фильтром, в каталог. WDS может индексировать любой тип файла, для которого имеется зарегистрированный фильтр.

В некоторых случаях вам не нужно писать новый фильтр. WDS 2.x содержит фильтры для более чем 200 типов элементов (включая элементы с открытым текстом, такие как HTML, XML и файлы исходного кода) и использует ту же технологию IFilter, что и SharePoint Services. Если для типов файлов уже установлены фильтры, WDS может использовать эти существующие фильтры для индексирования этих данных. Кроме того, WDS включает общий фильтр для типов файлов на основе открытого текста. Если у вас есть тип файла, который можно обработать с помощью существующего фильтра SharePoint Services или фильтра в виде открытого текста, вы можете добавить расширение имени файла и GUID фильтра в реестр, чтобы WDS могли найти и использовать его (дополнительные сведения см. в разделе Регистрация надстройки фильтра).

Однако если у вас есть данные или формат файла, не являющиеся открытым текстом и защищаемые, написание реализации настраиваемого фильтра — единственный способ убедиться, что WDS может индексировать формат файла в каталоге. Вы можете использовать только одну надстройку фильтра для определенного типа файла, поэтому можно переопределить существующий фильтр или переопределить другой фильтр для определенного типа файла.

В этом разделе рассматриваются следующие вопросы.

Обязательные интерфейсы фильтра

Надстройка фильтра должна реализовывать интерфейс IFilterи один из следующих интерфейсов:

  • IPersistStream — для загрузки данных из потока. Это более безопасно, чем использование файлов, так как на диск ничего не записывается. Интерфейс IPersistStream является предпочтительным методом прямой совместимости с Windows Vista.
  • Интерфейс IPersistFile — для загрузки данных из файла. Этот интерфейс не поддерживается в Windows Vista.
  • Интерфейс IPersistStorage — для загрузки данных из структурированного хранилища OLE COM.

Надстройка фильтра использует эти интерфейсы для получения содержимого элемента и его итеративного возврата в индекс до тех пор, пока не будет достигнут конец файла. Надстройка фильтра должна быть максимально надежной для обработки поврежденных файлов и файлов, которые не соответствуют ожидаемым форматам ввода.

Интерфейс IFilter

Это обязательный интерфейс для реализации фильтра. Дополнительные сведения см. в справочнике по интерфейсу IFilter.

Метод Описание
Init() Инициализирует сеанс фильтрации.
GetChunk() Размещает фильтр в начале первого или следующего блока и возвращает дескриптор.
GetText() Извлекает текст из текущего фрагмента.
GetValue() Извлекает значения свойств из текущего фрагмента.
BindRegion() В настоящее время зарезервировано для внутреннего использования; не реализует. Этот метод возвращает E_NOTIMPL.

 

IPersistStream

Этот интерфейс загружает файл из потока для более безопасной обработки, чем интерфейс IPersistFile, так как контексту, в котором выполняется фильтр IPersistStream , не требуются права на открытие файлов на диске или по сети. Из двух методов доступа к одному файлу это предпочтительный метод для прямого совместимости с Windows.

Метод Описание
IsDirty() Проверяет, произошло ли изменение. Этот метод возвращает E_NOTIMPL в фильтрах.
InitNew() Создает новое хранилище. Этот метод возвращает E_NOTIMPL в фильтрах.
Load() Инициализирует объект из потока, в котором он был предварительно сохранен.
Save() Сохраняет объект в указанный поток и указывает, должен ли объект сбросить флаг грязное. Этот метод возвращает E_NOTIMPL в фильтрах.
GetSizeMax() Возвращает размер потока, необходимого для сохранения объекта, в байтах. Этот метод возвращает E_NOTIMPL в фильтрах.

 

IPersistFile

Этот интерфейс загружает файл по абсолютному пути и не поддерживается в Windows Vista.

Метод Описание
GetCurFile() Возвращает текущее имя файла, связанного с объектом . Возвращает путь, указанный в Load().
Load() Открывает указанный файл и инициализирует объект из содержимого файла. Вы можете отложить открытие файла до тех пор, пока он вам не понадобится.
GetClassID() Возвращает идентификатор класса (CLSID) для нового типа файла. Для создания уникального идентификатора CLSID следует использовать uuidgen.exe.
IsDirty() Требуется только возвращать E_NOTIMPL в фильтрах
Save() Требуется только возвращать E_NOTIMPL в фильтрах
SaveCompleted() Требуется только возвращать E_NOTIMPL в фильтрах

 

IPersistStorage

Этот интерфейс поддерживает структурированную модель хранения, в которой каждый содержащийся объект имеет собственное хранилище, вложенное в хранилище контейнера. Как и интерфейс IPersistFile, этот интерфейс загружается по абсолютному пути и не поддерживается в Windows Vista.

Метод Описание
IsDirty() Проверяет, произошло ли изменение. Этот метод возвращает E_NOTIMPL в фильтрах.
InitNew() Создает новое хранилище. Этот метод возвращает E_NOTIMPL в фильтрах.
Load() Сохраняет хранилище. Этот метод возвращает E_NOTIMPL в фильтрах.
Save() Возвращает размер потока, необходимого для сохранения объекта, в байтах. Этот метод возвращает E_NOTIMPL в фильтрах.
SaveCompleted() Зарезервировано для внутреннего использования. Этот метод возвращает E_NOTIMPL в фильтрах.
HandsOffStorage() Зарезервировано для внутреннего использования. Этот метод возвращает E_NOTIMPL в фильтрах.

 

Вывод свойств с фильтрами

Фильтр предназначен для извлечения содержимого и свойств файлов для включения в полнотекстовый индекс. WDS сначала вызывает метод Load в реализациях IPersistFile, IPersistStream или IPersistStorage, а затем вызывает метод Init реализации IFilter. Метод GetChunk вызывается для получения фрагментов текста или данных значения свойства, а затем метод GetText или GetValue вызывается столько раз, сколько необходимо для получения всех значений текста или свойств, связанных с блоком. Этот процесс повторяется до тех пор, пока GetChunk не сообщит, что в документе больше нет блоков.

Метод GetChunk извлекает сведения о первом или следующем логическом блоке информации из фильтруемого файла и возвращает эти сведения в STAT_CHUNK структуре, включая монотонно увеличивающийся идентификатор блока, сведения о состоянии о том, как текущий блок связан с предыдущим блоком, флаг, указывающий, содержит ли блок текст или значение. языковой стандарт блока и спецификация свойства блока. Спецификация свойства — это FULLPROPSPEC , состоящий из идентификатора CLSID и целочисленного или строкового идентификатора свойства (например, D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Он определяет тип свойства, а не само значение свойства.

Идентификатор фрагмента языкового стандарта используется для выбора подходящего средства разбиения по словам, и очень важно правильно определить его. Если фильтр не может определить языковой стандарт текста, он должен принимать языковой стандарт системы по умолчанию, доступный с помощью GetSystemDefaultLCID. Если вы управляете форматом файла, который в настоящее время не содержит сведения о языковом стандарте, необходимо добавить функцию пользователя, чтобы включить правильную идентификацию языкового стандарта. Использование несогласованного средства разбиения по словам может привести к неправильному взаимодействию с запросами для пользователя.

GetChunk управляет только доступом к блокам и не возвращает само значение текста или свойства. Вместо этого последующие вызовы GetText и GetValue извлекают текст блока. GetText возвращает фрагменты текста, которые являются строками Юникода, из текущего фрагмента CHUNK_TEXT. Если текущий блок слишком велик, может потребоваться несколько вызовов метода GetText . Каждый вызов метода GetText извлекает текст, который сразу же следует за текстом из последнего вызова метода GetText . Например, последний символ из одного вызова может находиться в середине слова, а первый символ в следующем вызове будет продолжать это слово. Поисковые системы должны справиться с этой ситуацией.

GetValue возвращает значения свойств для текущего блока CHUNK_VALUE в структурах PROPVARIANT, которые могут содержать самые разные типы данных. GetValue должен выделить саму структуру PROPVARIANT с помощью CoTaskMemAlloc. Вызывающий объект GetValue отвечает за освобождение памяти, на которую указывает PROPVARIANT, с помощью PropVariantClear, а также за освобождение самой структуры с помощью CoTaskMemFree. Дополнительные сведения о PROPVARIANT см. в справочнике по PROPVARIANT .

Значения свойств

Фильтры должны выводить как минимум следующие свойства, которые являются столбцами по умолчанию в представлении результатов WDS.

GUID PROPSPEC Понятное имя Описание
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 PrimaryTitle Заголовок, отображаемый для этого элемента.
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 PrimaryAuthors Пользователь, наиболее связанный с этим элементом.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimaryDate PrimaryDate Наиболее важная дата для элемента, например дата получения по электронной почте или изменения для файлов.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PerceivedType PerceivedType Тип анализируемого файла. Должен соответствовать одному из типов Поиска на рабочем столе Windows, перечисленных в списке Воспринимаемый тип WDS.

 

Для элементов в виде открытого текста WDS извлекает все текстовые и системные свойства, такие как размер файла или расширение, при включении в индекс новых типов файлов в виде открытого текста). Другие типы свойств, которые могут быть возвращены в индекс, включают:

  • Для файлов: author, title, status, keywords
  • Для медиа: альбом, жанр, камера, дата взята
  • Для обмена данными: от, до, cc, важность
  • Для контактов: должность, рабочий телефон, компания

В приведенном выше списке сгруппированы свойства, общие для указанного воспринимаемого типа; однако можно использовать любое свойство независимо от типа. Например, компания может использоваться для имени работодателя контакта, а также для ссылки на имя клиента, к которым относится файл. Многие из этих свойств используются для отображения результатов поиска в представлении результатов WDS. Например, свойство Title файла отображается в виде столбца main в представлении результатов по умолчанию. Объекты IFilter должны выводить все свойства, связанные с типом элемента, который они анализируют. Пользовательские свойства нельзя добавить в WDS 2.x. Полный список доступных свойств см. в разделе Схема WDS.

Фильтрация установки надстройки

Установка фильтра включает копирование библиотеки DLL в соответствующее расположение в каталоге Program Files и ее регистрацию. Фильтры должны реализовывать самостоятельную регистрацию для установки и должны соответствовать следующим рекомендациям:

  • Установщик должен использовать установщик EXE или MSI.
  • Необходимо предоставить заметки о выпуске.
  • Для каждой установленной надстройки необходимо создать запись "Установка и удаление программ ".
  • Установщик должен перенять все параметры реестра для конкретного типа файла или хранилища, понятного текущей надстройке.
  • Если предыдущая надстройка перезаписывается, установщик должен уведомить пользователя.
  • Если более новая надстройка перезаписала предыдущую надстройку, должна быть возможность восстановить функциональность предыдущей надстройки и снова сделать ее надстройкой по умолчанию для этого типа файла или хранилища.

Идентификаторы CLSID, необходимые для регистрации

С каждым фильтром связаны три идентификатора класса ( CLSID). Для регистрации надстройки фильтра необходимо создать один или несколько из них (используйте uuidgen.exe).

  • Первый идентифицирует постоянный обработчик всех фильтров, IID_IFilter, то есть {89BCB740-6119-101A-BCB7-00DD010655AF}. Этот ИДЕНТИФИКАТОР CLSID является постоянным для всех фильтров, реализующих IFilter.
  • Второй (значение ключа IID_IFilter) определяет реализацию IFilter для вашего типа файла. Этот ключ содержит значение InprocServer32, указывающее имя библиотеки DLL по пути и модели потоков. Если фильтр находится в системном пути, например в каталоге system32, достаточно имени файла. В противном случае это значение должно иметь полную спецификацию пути.
  • Третий определяет тип файла, который обрабатывает фильтр, и возвращается методом GetClassID в интерфейсе IPersist.

Примечание

В будущих версиях операционных систем Майкрософт установка файлов в каталоге system32 может усложниться, поэтому мы рекомендуем установить их в разделе Program Files и включить полный путь к фильтру в реестре. В целях безопасности также целесообразно указать полный путь к библиотеке DLL в реестре. В противном случае можно загрузить версию "троянского коня" библиотеки DLL, если она будет находиться в пути процесса до вашей версии.

 

Модель регистрации

Когда служба WDS будет готова к фильтрации файла, она выполняет поиск в реестре под расширением файла, чтобы определить, какой фильтр следует загрузить. Затем он следует по ряду ссылок на реестр, чтобы найти имя библиотеки DLL фильтра в следующем порядке:

  1. Из идентификаторов CLSID, расположенных по адресу:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. Из типа содержимого файла по адресу:

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. Из расширения имени файла (аналогично API Win32 LoadIFilter) по адресу:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

    HKEY_CLASSES_ROOT\extpersistentHandler-CLSID-IID_IFilter-CLSID>>>

  4. Из значения по умолчанию в:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

Регистрация надстройки фильтра

Чтобы зарегистрировать надстройку фильтра, необходимо внести в реестр в общей сложности восемь записей, где:

  • .ext — это новое расширение имени файла
  • GUID_1 может быть любым новым ИДЕНТИФИКАТОРом GUID, созданным для этого расширения.
  • 89BCB740-6119-101A-BCB7-00DD010655AF — это GUID интерфейса IFilter, который является константой для всех реализаций IFilter.
  1. Зарегистрируйте постоянный обработчик для расширения имени файла со следующими ключами и значениями:

    HKEY_CLASSES_ROOT\<.ext>\PersistentHandler
       (Default) = {GUID_1}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}
       (Default) = <Persistent Handler Description>
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered
       (Default) = (Value Not Set)
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}
       (Default) = {CLSID of IFilter implementation}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler
       (Default) = {GUID_1}
    
  2. Зарегистрируйте реализацию IFilter со следующими ключами и значениями:

    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}
       (Default) = Extension IFilter Description">
    
    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32
       (Default) = <DLL Install Path>
       ThreadingModel = Both
    
  3. Зарегистрируйте реализацию IFilter в поиске компьютеров Windows со следующим ключом и значением:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

Reference

SchemaTable

Воспринимаемые типы

Разработка обработчиков протоколов

Другие ресурсы

Ifilter