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


Общие сведения о обработчиках фильтров в поиске Windows

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

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

Сведения об интерфейсе IFilter

Поиск Microsoft Windows использует фильтры для извлечения содержимого элементов для включения в полнотекстовый индекс. Вы можете расширить поиск Windows, чтобы индексировать новые или закрытые типы файлов, написав фильтры для извлечения содержимого и обработчиков свойств для извлечения свойств файлов.

Интерфейс IFilter предназначен для удовлетворения конкретных потребностей полнотекстовых поисковых систем. Полнотекстовые поисковые системы, такие как Поиск Windows, вызывают методы IFilter для извлечения текста и сведений о свойстве и добавления их в индекс. Поиск Windows разбивает результаты возвращаемого метода IFilter::GetText на слова, нормализует их и сохраняет их в индексе. Если возможно, поисковая система использует идентификатор кода языка (LCID) для фрагмента текста, чтобы выполнять разбиение и нормализацию слов с учётом конкретного языка.

Поиск Windows использует три функции, описанные в следующей таблице, для доступа к зарегистрированным обработчикам фильтров (реализации интерфейса IFilter). Эти функции особенно полезны при загрузке и привязке к обработчику фильтра внедренного объекта.

Функция Описание
LoadIFilter Получает указатель на IFilter, наиболее подходящий для указанного типа контента.
BindIFilterFromStorage Возвращает указатель на IFilter, который наиболее подходит для содержимого в объекте интерфейса IStorage.
BindIFilterFromStream Получает указатель на IFilter, наиболее соответствующий указанному идентификатору класса (CLSID), полученному из переменной потока.

Интерфейс IFilter имеет пять методов, описанных в следующей таблице.

Метод Описание
IFilter::Init Инициализирует сеанс фильтрации.
IFilter::GetChunk Позиция IFilter устанавливается в начале первого или следующего блока и возвращает дескриптор.
IFilter::GetText Извлекает текст из текущего блока.
IFilter::GetValue Извлекает значения из текущего блока.
IFilter::BindRegion Извлекает интерфейс, представляющий указанную часть объекта. Зарезервировано для дальнейшего использования.

Процесс изоляции

Поиск Windows запускает IFilters в контексте безопасности локальной системы с ограниченными правами. В этом процессе изоляции хоста IFilter удаляется ряд прав:

  • Ограниченный код
  • Каждый
  • Местный
  • Интерактивный
  • Прошедшие проверку подлинности пользователи
  • Встроенные пользователи
  • Идентификатор безопасности пользователей (SID)

Удаление этих прав означает, что интерфейс IFilter не имеет доступа к дисковой системе или сети или к функциям пользовательского интерфейса или буфера обмена. Кроме того, процесс изоляции выполняется в рамках объекта задания, который предотвращает создание дочерних процессов и накладывает ограничение в 100 МБ на рабочий набор. процесс изоляции узла интерфейса IFilter увеличивает стабильность платформы индексирования из-за возможности неправильно реализованных сторонних фильтров.

Заметка

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

Библиотеки DLL IFilter

DLL-библиотеки реализуют интерфейс IFilter, чтобы клиент мог извлекать сведения о текстах и значениях свойств из типа файла, класса или предполагаемого типа. Процесс фильтрации Windows SearchFilterHost.exe привязывается к IFilter, зарегистрированному для класса, воспринимаемого типа или расширения имени элемента.

Структура IFilter

Каждый IFilter — это DLL-файл, реализующий COM-сервер для предоставления указанных возможностей фильтрации. На следующем рисунке показана общая структура типичных библиотек DLL IFilter. Более сложный пример может реализовать более чем один класс IFilter.

схема структуры типичной DLL библиотеки ifilter

Нативный код

Фильтры должны быть записаны в нативном коде из-за возможных проблем с управлением версиями общей языковой среды выполнения (CLR) в общем процессе выполнения нескольких надстроек. В Windows 7 и более поздних версиях фильтры, написанные в управляемом коде, явно блокируются.

Поиск идентификатора класса IFilter

Класс DLL IFilter зарегистрирован в реестре под ключом PersistentHandler. В следующем примере для HTML-файлов показано, как найти библиотеку DLL IFilter для HTML-документа. В этом примере используется логика, аналогичная той, которую применяет система для поиска IFilter, связанного с элементом.

  1. Проверьте, зарегистрировано ли расширение для типа файлов, которые фильтрует DLL, под именем PersistentHandler в записи реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Пусть этот ключ будет Value1. Если эта запись уже существует, перейдите к шагу 4 данной процедуры и используйте Value1 в этом ключе. Значения имеют тип REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. В качестве альтернативы, если для расширения нет зарегистрированного объекта PersistentHandler, найдите CLSID, связанный с типом документа в соответствующей записи реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Пусть этот ключ будет Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Определите, зарегистрирован ли PersistentHandler для CLSID. Используя Value2, определенный на шаге 2, найдите PersistentHandler для записи \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Пусть этот ключ будет Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Определите GUID постоянного обработчика IFilter. Используя Value1 и Value3, найдите GUID-идентификатор IFilter обработчика сохранения для типа документа. Значение в записи реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 или 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> дает IFilter PersistentHandler GUID для этого типа документа. Пусть этот ключ будет Value4. В этом примере идентификатор GUID интерфейса IFilter — 89BCB740-6119-101A-BCB7-00DD010655AF.
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {EEC97550-47A9-11CF-B952-00AA0051FE20}
                 = HTML File Persistent Handler
                    Data type         REG_SZ
                        PersistentAddinsRegistered
                        {89BCB740-6119-101A-BCB7-00DD010655AF}

                    Data type         REG_SZ
                        default = {E0CA5340-4534-11CF-B952-00AA0051FE20}

Заметка

В этом примере библиотека DLLIFilterдля HTML-документов nlhtml.dll.

IFilter::GetChunk и идентификаторы кода языкового стандарта

LCID текста может изменяться в одном файле. Например, текст руководства может быть альтернативным между английским (en-us) и испанским (es) или текстом может содержать одно слово на языке, отличном от основного языка. В любом случае IFilter должен начинать новый блок при каждом изменении LCID. Так как LCID используется для выбора соответствующего средства разбиения слов, очень важно правильно определить его. Если IFilter не может определить языковой стандарт текста, то он должен вернуть LCID равный нулю вместе с блоком. Возвращение LCID, равного нулю, приводит к тому, что поиск Windows использует технологию автоматического определения языка (LAD) для определения идентификатора языкового стандарта фрагмента. Если поиск Windows не может найти совпадение, он возвращается к системной локали по умолчанию (вызывая функцию GetSystemDefaultLocaleName). Дополнительные сведения см. в разделе IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATEи STAT_CHUNK.

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

Заметка

Фильтры связаны с типами файлов, как указано расширениями имени файла, типами MIME или CLSID. Хотя один фильтр может обрабатывать несколько типов файлов, каждый тип работает только с одним фильтром.

Дополнительные ресурсы

  • Пример кода IFilterSample, доступный в GitHub, демонстрирует, как создать базовый класс IFilter для реализации интерфейса IFilter.
  • Для обзора процесса индексирования см. раздел Процесс индексирования.
  • Для получения общего представления о типах файлов см. Типы файлов.
  • Чтобы запросить атрибуты ассоциации файлов для типа файла, см. раздел PerceivedTypes, SystemFileAssociations ирегистрация приложений.

разработка обработчиков фильтров

Лучшие практики создания обработчиков фильтров в Windows Search

возврат свойств из обработчика фильтров

Обработчики фильтров , которые поставляются с Windows

Реализация обработчиков фильтров в Windows Search

Регистрация обработчиков фильтров

Тестирование обработчиков фильтров