开发用于Windows搜索的属性处理程序

Microsoft Windows搜索使用属性处理程序从项中提取属性的值,并使用属性系统架构来确定应如何为特定属性编制索引。 若要读取和索引属性值,Windows搜索调用属性处理程序,以提高安全性和稳定性。 相比之下,Windows资源管理器调用属性处理程序以读取和写入属性值。

本主题补充属性系统主题,其中包含特定于Windows搜索的信息,并包含以下部分:

 

属性处理程序的设计决策

实现属性处理程序涉及以下步骤:

  1. 就要支持的属性做出设计决策。
  2. 为尚未在属性系统中的属性创建属性说明 (.propdesc) 文件。
  3. 实现和测试属性处理程序。
  4. 安装和注册属性处理程序和属性说明文件。
  5. 测试属性处理程序安装和注册。

在开始之前,需要考虑以下设计问题:

  • 文件格式是否支持哪些属性?
  • 这些属性是否已在系统架构中?
  • 是否可以使用现有的系统提供的属性处理程序?
  • 哪些属性可以显示给最终用户?
  • 用户可以编辑哪些属性?
  • 是否应支持全文搜索来自属性处理程序或筛选器?
  • 是否需要支持旧版应用程序? 如果是这样,该怎么办?

注意

在继续之前,请参阅 使用System-Supplied属性处理程序 查看是否可以使用系统提供的属性处理程序,从而节省时间和开发资源。

 

做出这些决定后,可以编写自定义属性的正式说明,以便Windows搜索引擎可以开始为文件和属性编制索引。 这些正式说明是 XML 文件,如 属性说明架构中所述。

属性决策

考虑支持哪些属性时,应确定用户的索引和搜索需求。 例如,你可能能够识别一百个可能有用的文件类型属性,但用户可能只对搜索少量感兴趣。 此外,你可能希望向Windows资源管理器中的用户显示不同的、更大或更小的属性组,并允许用户仅编辑显示的这些属性的子集。

文件类型可以支持你定义的任何自定义属性,以及一组系统定义的属性。 在创建自定义属性之前,请查看 系统属性 ,查看要支持的属性是否已由系统属性定义。 始终确保支持最重要的系统定义属性。

建议使用矩阵来帮助设计属性:

属性名称 可编制索引吗? 是否可显示? 是否可编辑?
property1 Y Y N
财产。。。 Y Y N
propertyn N N N

 

对于每个属性,需要确定它应具有哪些属性,然后在属性说明 XML 文件中正式描述它们 (.propdesc) 。 属性包括属性的数据类型、标签、帮助字符串等。 对于可索引属性,应特别注意在属性说明文件的 searchInfo XML 元素中找到的以下属性属性。

属性 描述
inInvertedIndex 可选。 指示字符串属性值是否应分解为单词,以及存储在倒排索引中的每个单词。 反转索引允许使用 CONTAINS 或 FREETEXT ((例如 SELECT... )在属性值上高效搜索单词和短语。WHERE CONTAINS “sometext”) 。 如果设置为 FALSE,则针对整个字符串执行搜索。 大多数字符串属性应将此设置为 TRUE;非字符串属性应将此设置为 FALSE。 默认值为 FALSE
isColumn 可选。 指示属性是否应作为列存储在Windows搜索数据库中。 将属性存储为列可以检索、排序、分组和筛选 (,即在整个列值上使用 CONTAINS 或 FREETEXT 以外的任何谓词) 。 向用户显示的属性应设置为 TRUE ,除非它是非常大的文本属性, (类似于要在倒排索引中搜索的文档正文) 。 默认值为 FALSE
isColumnSparse 可选。 指示如果值为 NULL,则属性是否不占用任何空间。 非稀疏属性会占用每个项的空间,即使值为 NULL 也是如此。 如果该属性是多值,则此属性始终为 TRUE。 仅当每个项存在值时,此属性才应为 FALSE 。 默认值为 TRUE
columnIndexType 可选。 若要优化查询,Windows搜索引擎可以为具有 isColumn=TRUE 的属性创建辅助索引。 在编制索引期间,这需要更多的处理和磁盘空间,但在查询期间会提高性能。 如果属性倾向于按用户频繁地对属性进行排序、分组或筛选 (,即使用 =、!=、<、>、LIKE、MATCHES) ,则应将此属性设置为“OnDisk”。 默认值为“NotIndexed”。 以下为有效值:
  • NotIndexed:未创建辅助索引。
  • OnDisk:在磁盘上创建和存储辅助索引。
maxSize 可选。 指示Windows搜索数据库中存储的属性值允许的最大大小。 此限制适用于矢量的 indvidual 元素,而不是整个向量。 超出此大小的值将被截断。 默认值为“128” (字节) 。
目前,Windows搜索在计算从文件接受的数据量时不使用 maxSize。 相反,搜索使用 Windows的限制是文件大小和 MaxGrowFactor (文件大小 N * MaxGrowFactor) 从注册表读取的HKEY_LOCAL_MACHINE->Software->Microsoft->Windows Search->收集管理器->MaxGrowFactor。 默认 MaxGrowFactor 为 4 (4) 。 因此,如果文件类型的大小往往较小,但属性较大,Windows搜索可能不接受要发出的所有属性数据。 但是,可以增加 MaxGrowFactor 以满足需求。

 

注意

对于 columnIndexType 属性,需要根据辅助索引产生更大的索引时间和空间成本来权衡更快的查询的好处。 但是,对于具有非 null 值的项目,此费用仅支付,因此对于大多数属性,此属性可设置为“OnDisk”。

 

全文支持

一般情况下,称为 筛选器的组件支持全文搜索;但是,对于具有不复杂文件格式的基于文本的文件类型,属性处理程序可能无法为此功能提供更少的开发工作量。 应查看 全文内容 部分,了解筛选器和属性处理程序功能的比较,以帮助确定最适合文件类型的内容。 特别重要的一个事实是,筛选器可以处理多个语言代码标识符, (LCID) ,而属性处理程序则不能。

注意

由于属性处理程序无法按筛选器的方式对内容进行区块化,因此即使大型文件) 必须完全加载到内存中,也 (它们都是不复杂的文件格式。

 

操作系统实现注意事项

Windows 7 的实现信息

在 Windows 7 及更高版本中,注册属性处理程序、IFilter 或新扩展时会出现新行为。 安装新的属性处理程序和/或 IFilter 时,会自动重新编制具有相应扩展名的文件。

在 Windows 7 中,建议将 IFilter 与其相应的属性处理程序一起安装,并在属性处理程序之前注册 IFilter。 属性处理程序的注册会启动先前索引的文件的即时重新索引,而无需重新启动,并利用以前注册的任何 IFilter (s) ,以便进行内容索引。

如果仅安装 IFilter ,而不安装相应的属性处理程序,则在重新启动索引服务或重新启动系统后,自动重新编制索引。

有关特定于 Windows 7 的属性说明标志,请参阅以下参考主题:

Windows Vista 和更早版本的实现信息

在 Windows Vista 之前,筛选器提供了对分析和枚举文件内容和属性的支持。 通过引入属性系统,属性处理程序处理文件属性,而筛选器处理文件内容。 对于 Windows Vista,只需在与属性处理程序协调的情况下开发 IFilterinterface 的部分实现,如Windows搜索中创建筛选器处理程序的最佳做法中所述。

虽然属性系统还包含在Windows XP 的Windows搜索安装中,但第三方和旧应用程序可能需要筛选器处理内容和属性。 因此,如果要在 Windows XP 平台上进行开发,则应提供完整的筛选器实现以及文件类型或自定义属性的属性处理程序。

 

编写属性说明文件

propertyDescription 主题介绍了属性说明 XML 文件 (.propdesc) 的结构。 搜索特别感兴趣的是 searchInfo 元素的属性。 确定要支持哪些属性后,需要为每个属性创建和注册属性说明文件。 注册 .propdesc 文件时,它们将包含在架构的属性说明列表中,并成为搜索引擎属性存储中的列名称。

可以使用 PSRegisterPropertySchema 函数(调用架构子系统的 IPropertySystem::RegisterPropertySchema 的包装 API)注册自定义属性说明。 此函数通知架构子系统添加属性说明架构 (.propdesc) 文件,使用文件路径 (s) .propdesc 文件 (本地计算机上的) ,通常是应用程序在“Program Files”下的安装目录。 通常,安装或应用程序 (例如,属性处理程序安装程序) 在安装 .propdesc 文件 (s) 后调用此方法。

 

实现属性处理程序

开发属性处理程序涉及实现以下接口:

  • IInitialzeWithStream:提供基于流的属性处理程序初始化。
  • IPropertyStore:枚举、获取和设置属性值。
  • IPropertyStoreCapabilities:可选。 标识用户是否可以从用户界面编辑属性。

IInitializeWithStream

属性系统 主题中所述,强烈建议使用 IInitializeWithStream 实现属性处理程序,以执行基于流的初始化。 如果选择不实现 IInitializeWithStream,则属性处理程序必须通过在属性处理程序的注册表项上设置 DisableProcessIsolation 标志来选择退出在隔离进程中运行。 禁用进程隔离通常仅适用于旧属性处理程序,并且应由任何新代码避免。

IPropertyStore

若要创建属性处理程序,必须使用以下方法实现 IPropertyStore 接口。

方法 说明
提交 将属性更改保存到文件。
GetAt 从项的属性数组中检索属性键。
GetCount 获取附加到文件的属性数。
GetValue 检索特定属性的数据。
SetValue 设置新的属性值或替换或删除现有值。

 

 

 

有关实现此接口的重要注意事项包含在 IPropertyStore 文档中。

注意

如果属性处理程序为给定项发出同一属性的多个值,则只存储目录中发出的最后一个值。

 

 

IPropertyStoreCapabilities

属性处理程序可以选择实现此接口,以禁用用户编辑特定属性的能力。 这些属性通常可在“详细信息”页和窗格中进行编辑,但不允许在实现的属性处理程序下编辑它们。 正确实现此接口可提供比替代项更好的用户体验,即 Shell 中的简单运行时错误。

 

确保项已编制索引

实现属性处理程序后,需要确保为获取索引注册处理程序的项。 可以使用 目录管理器 启动重新编制索引,还可以使用 爬网范围管理器 设置默认规则,指示索引器要爬网的 URL。 另一个选项是遵循Windows搜索 SDK 示例中的 ReIndex 代码示例。

有关详细信息,请参阅 使用目录管理器 和使用 爬网范围管理器

 

安装和注册属性处理程序

实现属性处理程序后,必须注册它及其与处理程序关联的文件扩展名。 以下示例显示了执行此操作所需的注册表项和值。

HKEY_CLASSES_ROOT
   CLSID
      {<CLSID for property handler>}
         (Default) = <Property Handler Name>
         InProcServer32
            (Default) = <full path to property handler dll>
            ThreadingModel = <your threading model>
HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               PropertySystem
                  PropertyHandlers
                     <.fileextention>
                        (Default) = {<CLSID for property handler>}

 

测试和故障排除属性处理程序

以下列表提供有关应执行的测试类型的建议:

  • 测试从文件类型支持的每个属性获取输出。
  • 例如,在 HTML 文档中使用大型元标记。例如,使用大属性值。
  • 检查属性处理程序在从属性处理程序获取输出后或使用诸如枚举文件属性前后oh.exe之类的工具,不会泄露文件句柄。
  • 测试与属性处理程序关联的所有文件类型。 例如,检查 HTML 筛选器是否适用于.htm和.html文件类型。
  • 使用损坏的文件进行测试。 属性处理程序应正常失败。
  • 如果应用程序支持加密,请测试属性处理程序是否不输出加密文本。
  • 如果属性处理程序支持全文搜索:
    • 在文件内容中使用多个特殊的 Unicode 字符,并测试其输出。
    • 测试非常大的文档的处理,以确保属性处理程序按预期工作。

安装和安装测试

最后,需要测试安装和卸载例程。

  • 安装必须从失败的安装 (恢复,例如,从取消和重启安装程序) 。
  • 卸载必须删除与属性处理程序关联的所有文件。
  • 卸载不能删除与属性处理程序安装关联的文件以外的文件。
  • 卸载时,必须删除与属性处理程序关联的注册表项。
  • 即使从安装目录中删除文件,卸载也必须正常工作。

属性处理程序疑难解答

以下是开发属性处理程序时出现的一些常见错误:

  • 在用户目录下安装 .propdesc 文件或 DLL。
  • 使用相对路径注册组件。
  • 在HKEY_CURRENT_USER下注册组件,而不是HKEY_LOCAL_MACHINE。
  • 忘记为非流处理程序设置 DisableProcessIsolation。
  • 将测试文件置于未编制索引的位置。

如果在使属性处理程序使用索引器时遇到问题,下面是一些帮助进行故障排除的提示:

  • 验证属性说明 (.propdesc 文件) 是否标记为Column=“true”,isViewable=“true”,并且 isQueryable=“true”适当。
  • 验证 .propdesc 文件是否位于全局位置。
  • 验证是否使用绝对路径注册了 .propdesc 文件。
  • 验证事件日志是否未记录注册 .propdesc 文件的任何失败。
  • 验证 DLL 是否位于全局位置 (,而不是在用户配置文件) 下。
  • 验证 DLL 是否已在HKEY_LOCAL_MACHINE\Software\Classes下注册。
  • 使用完整路径 (或REG_EXPAND_SZ字符串验证是否使用系统帐户已知的环境变量) 扩展为绝对路径的 DLL。
  • 验证属性处理程序是否在Windows资源管理器下工作。
  • 虽然我们建议使用 IInitializeWithStream,但如果必须使用 IInitializeWithFile 或 IInitializeWithItem,请验证是否指定 DisableProcessIsolation。
  • 验证索引选项控制面板将文件类型列为索引文件类型。
  • 验证测试文件是否位于索引位置。
  • 验证自安装属性处理程序以来测试文件是否已修改。

如果测试文件位于索引位置并且索引器已爬网该位置,则需要以某种方式修改该文件,以触发文件重新编制索引。

 

使用 System-Supplied 属性处理程序

Windows包含许多系统提供的属性处理程序,如果文件类型的格式兼容,可以使用这些处理程序。 如果定义了一个新的文件扩展名,该扩展名使用这些格式之一,则可以通过为文件扩展名注册处理程序类标识符 (CLSID) 来使用系统提供的处理程序。

可以使用下表中列出的 CLSID 为文件格式类型注册系统提供的属性处理程序。

格式 CLSID
OLE DocFile {8d80504a-0826-40c5-97e1-ebc68f953792}
保存游戏 XML {ECDD6472-2B9B-4b4b-AE36-F316DF3C8D60}
XPS/OPC 处理程序 {45670FA8-ED97-4F44-BC93-305082590BFB}
XML {c73f6f30-97a0-4ad1-a08f-540d4e9bc7b9}

 

在创建自定义属性之前,应确保没有可以改用的系统定义属性。 可以通过调用 PSEnumeratePropertyDescriptions 或使用prop.exe命令行工具来枚举系统定义的属性。

系统架构定义这些属性如何与索引器交互,并且无法更改该属性。 此外,用于创建、编辑和保存文件类型的应用程序也需要符合某些行为。 例如,如果应用程序实现安全保存 (在编辑期间创建临时文件,然后使用 ReplaceFile () 交换旧) 的新版本,则必须将所有属性从原始文件传输到新文件。 失败意味着文件会丢失用户或其他应用程序添加的属性。

 

示例

下面显示了为文件类型注册系统提供的 OLE DocFile 处理程序的注册。OLEDocFile 扩展。

HKEY_CLASSES_ROOT
   SystemFileAssociations
      .OLEDocFile
         shellex
            {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
               (Default) = {9DBD2C50-62AD-11d0-B806-00C04FD706EC}

下面显示了属性列表信息的注册,因此属性的注册。OLEDocFile 文件显示在“详细信息”选项卡和窗格中。

HKEY_CLASSES_ROOT
   SystemFileAssociations
      .OLEDocFile
         ExtendedTileInfo = prop:System.ItemType;System.Size;System.DateModified;System.Author;System.OfflineAvailability
         FullDetails = prop:System.PropGroup.Description;System.Title;System.Subject;
System.Keywords;System.Category;System.Comment;System.PropGroup.Origin;
System.Author;System.Document.LastAuthor;System.Document.RevisionNumber;
System.Document.Version;System.ApplicationName;System.Company;System.Document.Manager;
System.Document.DateCreated;System.Document.DateSaved;System.Document.DatePrinted;
System.Document.TotalEditingTime;System.PropGroup.Content;System.ContentStatus;
System.ContentType;System.Document.PageCount;System.Document.WordCount;
System.Document.CharacterCount;System.Document.LineCount;
System.Document.ParagraphCount;System.Document.Template;System.Document.Scale;
System.Document.LinksDirty;System.Language;System.PropGroup.FileSystem;
System.ItemNameDisplay;System.ItemType;System.ItemFolderPathDisplay;
System.DateCreated;System.DateModified;System.Size;System.FileAttributes;
System.OfflineAvailability;System.OfflineStatus;System.SharedWith;
System.FileOwner;System.ComputerName
         InfoTip = prop:System.ItemType;System.Size;System.DateModified;System.Document.PageCoun
         PerceivedType = document
         PreviewDetails = prop:*System.DateModified;System.Author;System.Keywords;
*System.Size;System.Title;System.Comment;System.Category;
*System.Document.PageCount;System.ContentStatus;System.ContentType;
*System.OfflineAvailability;*System.OfflineStatus;System.Subject;
*System.DateCreated;*System.SharedWith

 

参考

属性映射

概念性

在Windows搜索中创建筛选器处理程序的最佳做法

索引过程

开发协议处理程序

自定义文件格式的系统定义属性

其他资源

属性系统

系统属性

Windows搜索 SDK 示例