Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Заметка
Windows Desktop Search 2.x — это устаревшая технология, которая изначально была доступна в виде надстройки для Windows XP и Windows Server 2003. В последующих выпусках вместо этого используйте Поиск Windows.
Вы можете расширить Поиск на рабочем столе Microsoft Windows (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 | Основное название | Заголовок, отображаемый для этого элемента. |
F29F85E0-4FF9-1068-AB91-08002B27B3D9 | 4 | Основные авторы | Человек, наиболее связанный с этим предметом. |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | ПервичнаяДата | ОсновнаяДата | Наиболее важная дата для элемента, например дата получения для электронной почты или изменения для файлов. |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | ВоспринятыйТип | Воспринятый тип | Тип синтаксического анализа файла. Должен соответствовать одному из типов поиска Windows Desktop Search, перечисленных в WDS Тип. |
Для элементов с открытым текстом WDS извлекает все текстовые и системные свойства, такие как размер файла или расширение, включая новые типы файлов обычного текста в индекс). Другие типы свойств, которые можно вернуть в индекс, включают:
- Для файлов: автор, название, состояние, ключевые слова
- Для медиа: альбом, жанр, производитель камеры, дата съемки
- Для обмена данными: от, до, cc, важность
- Для контактов: должность, бизнес-телефон, компания
Приведенный выше список групп свойств, общих для указанного предполагаемого типа; однако любое свойство можно использовать независимо от типа. Например, компания может использоваться для имени работодателя контакта, а также может использоваться для ссылки на имя клиента, к которым относится файл. Многие из этих свойств используются для отображения результатов поиска в представлении результатов WDS. Например, свойство Title файла отображается как основной столбец в представлении результатов по умолчанию. Объекты IFilter должны выводить все свойства, связанные с типом элемента, который они анализируют. Пользовательские свойства нельзя добавлять в WDS 2.x. Полный список доступных свойств см. в схеме WDS.
Установка надстройки фильтрации
Установка фильтра включает копирование библиотеки DLL в соответствующее расположение в каталоге Program Files и её регистрацию. Фильтры должны реализовать самостоятельную регистрацию для установки и следовать следующим рекомендациям:
- Для установки необходимо использовать либо установщик EXE, либо MSI.
- Заметки о выпуске должны предоставляться.
- Для каждой установленной надстройки необходимо создать запись в разделе Установка и удаление программ.
- Установщик должен взять на себя все параметры реестра для определенного типа файла или хранилища, которые поддерживает текущая надстройка.
- Если предыдущая надстройка перезаписывается, установщик должен уведомить пользователя.
- Если более новая надстройка перезаписала предыдущую надстройку, должна быть возможность восстановить функциональность предыдущей надстройки и сделать ее надстройкой по умолчанию для этого типа файла или снова хранить.
CLSIDs, необходимые для регистрации
Существует три идентификатора класса или CLSID, связанные с каждым фильтром. Вам потребуется создать одну или несколько таких (используйте uuidgen.exe), чтобы зарегистрировать надстройку фильтра.
- Первый идентифицирует постоянный обработчик всех фильтров, IID_IFilter, который равен {89BCB740-6119-101A-BCB7-00D010655AF}. Этот CLSID является константой для всех фильтров, реализующих IFilter.
- Второй (значение ключа IID_IFilter) определяет реализацию IFilter для типа файла. Этот ключ содержит значение InprocServer32, указывающее имя библиотеки DLL по пути и модели потоков. Если фильтр находится в системном пути, например в каталоге system32, достаточно имени файла. В противном случае это значение должно иметь полную спецификацию пути.
- Третий определяет тип файла, который обрабатывает фильтр, и возвращается методом GetClassID в вашем интерфейсе IPersist.
Заметка
В будущих версиях операционных систем Майкрософт установка файлов в каталоге system32 может оказаться более сложной, поэтому мы рекомендуем установить их в program Files и включить полный путь к фильтру в реестре. По соображениям безопасности также рекомендуется указать полный путь к библиотеке DLL в реестре. В противном случае может быть загружена версия вашей библиотеки DLL с "троянским конем", если она окажется в пути к процессу раньше вашей версии.
Модель регистрации
Когда WDS готов фильтровать файл, он ищет в реестре по расширению файла, чтобы определить, какой фильтр загрузить. Затем процесс следует цепочке ссылок в реестре, чтобы найти имя библиотеки DLL фильтра в следующем порядке:
Из CLSID, расположенных по адресу:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
Из типа контента файла по адресу:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type
Из расширения имени файла (аналогично API LoadIFilter Win32) по адресу:
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
По умолчанию:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
Чтобы зарегистрировать надстройку фильтра
Чтобы зарегистрировать надстройку фильтра, необходимо внести в реестр в общей сложности восемь записей.
- .ext — это новое расширение имени файла
- GUID_1 может быть любым новым GUID, созданным для этого расширения.
- 89BCB740-6119-101A-BCB7-00DD010655AF — это идентификатор GUID интерфейса IFilter, который является константой для всех реализаций IFilter.
Зарегистрируйте постоянный обработчик для расширения имени файла со следующими ключами и значениями:
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}
Зарегистрируйте реализацию 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
Зарегистрируйте реализацию IFilter в Windows Desktop Search со следующим ключом и значением:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext> (Default) = {CLSID of IFilter implementation}"
Связанные разделы
-
Справочник
-
другие ресурсы