Общие сведения об обработчиках фильтров в Windows Search
Обработчики фильтров, которые являются реализациями интерфейса IFilter , сканируют документы на наличие текста и свойств. Обработчики фильтров извлекают фрагменты текста из этих элементов, отфильтровывая внедренное форматирование и сохраняя сведения о положении текста. Они также извлекают фрагменты значений, которые являются свойствами документа. IFilter — это основа для создания приложений более высокого уровня, таких как индексаторы документов и средства просмотра, независимые от приложений.
Эта тема организована следующим образом:
- Сведения об интерфейсе 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 .
Машинный код
Фильтры должны быть написаны в машинном коде из-за потенциальных проблем с управлением версиями среды CLR при выполнении нескольких надстроек. В Windows 7 и более поздних версиях фильтры, написанные в управляемом коде, явно блокируются.
Поиск идентификатора класса IFilter
Класс библиотеки DLL IFilter регистрируется в разделе реестра PersistentHandler. В следующем примере для HTML-файлов показано, как найти библиотеку DLL IFilter для HTML-документа. В этом примере используется логика, аналогичная той, которая используется системой для поиска IFilter, связанного с элементом.
- Проверьте, зарегистрировано ли расширение для типа файлов, которые фильтрует БИБЛИОТЕКА DLL, в записи реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Пусть этот ключ будет
Value1
. Если эта запись уже существует, перейдите к шагу 4 этой процедуры и используйтеValue1
в этом ключе. Значения имеют тип REG_SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Кроме того, если для расширения не зарегистрирован 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}
- Определите, зарегистрирован ли 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}
- Определите 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. Хотя один фильтр может обрабатывать несколько типов файлов, каждый тип работает только с одним фильтром.
Дополнительные ресурсы
- В примере кода IFilterSample , доступном на сайте GitHub, показано, как создать базовый класс IFilter для реализации интерфейса IFilter .
- Общие сведения о процессе индексирования см. в разделе Процесс индексирования.
- Общие сведения о типах файлов см. в разделе Типы файлов.
- Чтобы запросить атрибуты сопоставления файлов для типа файла, см. статьи PerceivedTypes, SystemFileAssociations и Регистрация приложений.
Связанные темы
Разработка обработчиков фильтров
Рекомендации по созданию обработчиков фильтров в Windows Search
Возврат свойств из обработчика фильтра
Обработчики фильтров, поставляемые с Windows
Реализация обработчиков фильтров в Windows Search