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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

Ifilter Библиотеки DLL реализуют интерфейс IFilter , чтобы клиент мог извлекать сведения о значении текста и свойства из типа файла, класса или воспринимаемого типа. Процесс фильтрации Windows Search 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, в записи реестра \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 Persistent Handler для типа документа. Значение в записи реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 или 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> возвращает идентификатор GUID IFilter PersistentHandler для этого типа документа. Пусть этот ключ будет 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}

Примечание

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

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

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

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

Примечание

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

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

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

Рекомендации по созданию обработчиков фильтров в Windows Search

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

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

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

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

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