【2024-02-26 05:20:35爱思瑞网快讯】
Spotlight是苹果的智能搜索索引程序,用于macOS。以下是如何使用元数据工具获取有关文档的更多信息。
Spotlight在您的Mac或iOS设备上后台运行,静默地对文档的内容进行索引和扫描,因此当您搜索某个内容时,它可以迅速找到结果。
Spotlight的主要后台守护进程被称为corespotlightd,在全速运行时可能会使用8-10%的CPU时间。
在Apple Silicon Mac上,corespotlightd可以在峰值后台索引期间同时运行四个线程。
如果您是Apple开发人员,可以将Core Spotlight框架添加到您的应用程序中,并自动将应用程序的内容进行内部索引,以便自动为应用程序用户提供内容。
Foundation框架中还有其他Spotlight API,允许您在应用程序内部对Spotlight数据进行本地搜索。
您还需要将Core Services.framework添加到您的Xcode项目中,因为它是文件元数据API的所在位置。
还有iCloud Spotlight功能,我们在这里不会介绍。
设置要索引的卷
在macOS上,您可以指示Spotlight要索引哪些卷,哪些不要索引。如果您不从Spotlight中排除卷,则默认情况下它们将被索引。
如果您从Spotlight索引中排除卷,则它们的内容将不会显示在Spotlight搜索中。
如果您的Mac驱动器上有多个卷,或者连接了外部驱动器,您可以在每个卷上启用或禁用Spotlight(和Siri)。
要这样做,首先在macOS中打开系统设置,通过从Finder菜单栏的“Apple菜单”中选择“系统设置”。
在系统设置的左侧,向下滚动到并点击“Siri和Spotlight”。在Siri和Spotlight面板上,您可以打开和关闭Siri,设置键盘快捷键,设置语言以及Siri如何处理历史记录。
下面是一个Spotlight部分。在这里,您可以设置希望Spotlight索引的文档类型。
如果您在此部分关闭了特定类型的文档或数据,Spotlight将在索引过程中忽略所有这些类型的文档或数据。
如果滚动到该窗格的底部,您将看到一个标有“Spotlight隐私”的按钮。单击它打开隐私窗口。
隐私窗格包含当前从索引中排除的所有存储卷的列表 – 在大多数情况下,默认情况下为无卷或仅启动磁盘。
要将卷添加到隐私表中或从中删除卷,您可以将其拖放到其中,或者单击列表下方的“+”或“-”按钮。
一旦将卷添加到列表中,Spotlight将停止对其进行索引。
在隐私排除列表符合您的要求后,点击“完成”以关闭该窗口。关闭系统设置。
当corespotlightd索引您卷上的数据时,它搜索文件的内容,但也搜索并索引元数据。元数据可以定义为与文件关联的信息数据,但不包含在文件本身中。
元数据包括(但不限于)文件创建和最后修改日期、大小、版本、种类、名称以及在“取得信息”窗口中显示的Finder评论。
Spotlight使用Apple的Core Services框架中的文件元数据API来查找和读取元数据。
文件元数据API中有四种主要的数据类型:
- MDSchema
- MDItem
- MDLabelDomain
- MDQuerySortOptionFlags
我们不会详细介绍数据类型的所有细节,但存储引用文件系统项及其元数据的主要类型是MDItem
。
使用MDItem
和Core Services API,您可以检索、排序和存储本地文件系统中项目的元数据。
Spotlight导入器
如果在Mac的启动磁盘上打开/Library/Spotlight文件夹,您可能会注意到一个或多个具有mdimporter扩展名的文件。这些是Spotlight元数据导入器插件。
例如,Apple的Pages和原始iBooks Author应用程序具有.mdimporter插件。微软的365应用程序也提供它们。其他应用程序也提供它们。
您可以使用Apple的Xcode编写自定义的.mdimporter插件,将它们放置在/Library文件夹中,Spotlight将使用它们导入您的应用程序支持的文件的元数据。
.mdimporter插件本质上是代码和信息的绑定,告诉Spotlight可以导入哪些类型的元数据,以及如何访问这些数据。使用自定义的.mdimporter,您可以允许您的应用程序存储附加的元数据,并将其提供给Spotlight进行索引。
Apple还有一份(稍旧的)开发人员文档,名为Spotlight Importer Programming Guide,它向您展示了如何编写.mdimporter。
Apple和第三方还提供了几个命令行(CLI)工具,您可以在macOS的Terminal应用程序中使用这些工具来访问设备上存储的文件系统对象的Spotlight元数据。
Spotlight将其索引的元数据存储在每个挂载的磁盘卷上的本地数据库中。Spotlight元数据数据库称为“存储”。
每个存储包含每个文件系统对象的索引元数据以及使Spotlight搜索快速的一些附加数据。通过将文件元数据存储在单独的数据库中并更新它,Spotlight可以更快地搜索和检索数据,因为它不必每次都遍历文件系统层次结构。
在APFS卷上,Spotlight还使用一些内部卷元数据与存储元数据结合,以实现更快、更准确的搜索。
有许多Spotlight CLI实用程序命令可供使用,但您最有可能想使用的四个关键命令是:
- mdutil
- mdimport
- mdls
- mdfind
在终端中打开终端,然后键入“man”和空格,然后按下键盘上的 Return 键,您可以获取有关其中任何工具的使用信息。
请注意,其中一些命令在命令名称之后需要文件系统参数,而其他命令则不需要。例如,mdutil不需要,但是mdattributes是需要的。
要退出终端中的man
(手册)系统,请在键盘上按下Control-Z
。
mdutil
mdutil
命令是一个简单的实用程序,用于管理Mac上的Spotlight元数据存储。请注意,卷必须在Finder的桌面上挂载,mdutil
才能对其进行操作。
例如,使用mdutil
,您可以打开和关闭特定卷的Spotlight存储,禁用对该卷的搜索,擦除卷的存储,显示卷的Spotlight索引状态等。
您还可以将特定命令应用于每个索引卷的Spotlight存储,并刷新Spotlight存储缓存,以强制直接使用存储本身。
在终端中键入man mdutil
,然后按下键盘上的 Return 键,可以获取有关mdutil
的完整用法。
mdimport
mdimport
是一个Spotlight CLI实用程序,允许您手动将文件系统层次结构中的所有可搜索元数据导入Spotlight元数据存储。它使用上面提到的.mdimporter插件来导入和搜索数据。
您可以使用mdimport
打印存储在文件系统层次结构中的每个索引项的所有元数据项 – 此处除外,使用kMDItemTextContent键存储的项,因为这些项包含文件系统项的实际文本内容。
您还可以使用mdimport
测试您或您的团队编写的.mdimporter插件。
在终端中键入man mdimport
,然后按下键盘上的 Return 键,以获得有关mdimport
的完整用法。
mdls
mdls
是一个实用程序,使用预定义的元数据键(或“标签”)列出磁盘上单个文件的元数据属性。Apple定义了Spotlight使用的大多数元数据键,但如果您编写自己的.mdimporter,可以定义自己的键。
在终端中键入man mdls
,然后按下键盘上的 Return 键,可以获取mdls
的用法。
mdfind
mdfind
是一种灵活而强大的实用程序,允许您查找指定的元数据在文件系统层次结构中与您指定的特定匹配的所有对象 – 通过搜索特定卷上的Spotlight存储(或存储)。
使用mdfind
的各种选项,您可以从文件系统层次结构中的特定位置开始搜索,指定要匹配的元数据项,并指定要匹配的特定文件名。
mdfind
将仅返回与您指定的搜索条件匹配的文件的结果。
您可以通过在键盘上键入 Control-C 来取消运行中的mdfind
搜索。
还有一个-interpret
标志可以用于mdfind
,它允许您指定自然语言字符串,就像在Finder中输入一样。 mdfind
将解释该字符串并相应调整其搜索。
您还可以将mdfind
与其他标准UNIX实用程序(如grep
)结合使用,执行复杂的搜索并将结果导出到标准输出,包括文件。
在终端中键入man mdfind
,然后按下键盘上的 Return 键,可以获取mdfind
的用法。
这里没有提及的其他几个Spotlight实用程序,我们将在将来的文章中介绍。
属性键
Spotlight和Core Services文件元数据通过使用唯一的键或字符串存储每个元数据项在存储中。每个键告诉Spotlight和API您对哪个元数据项感兴趣。
Apple将元数据键定义为Core Foundation类型CFString
的字符串 – 在几乎所有与Apple相关的软件中都使用的常见Core Foundation字符串类型。使用Core Foundation API,您还可以直接从代码中直接操作CFStrings。
Apple在上面提到的文件元数据API文档中列出了大多数元数据属性键。大多数键以前缀kMD
(代表“常量”-“元数据”)开头。
要使用文件元数据API,通常使用其函数之一或Spotlight的函数之一,并指定元数据键以指示要使用的哪个元数据信息。键可以在检索和写入元数据时使用。
例如,在Swift中,任何给定文件系统对象的“添加日期”元数据项的元数据API键定义为:
let kMDItemDateAdded: CFString!
const CFStringRef kMDItemDateAdded;
(在Objective-C中,CFStringRef
是用于CFString的不透明Core Foundation类型)。
如果您是Apple开发人员并使用文件元数据API,您将经常使用元数据键。
对于音频/视频媒体文件,Apple还在AVFoundation框架中提供了另一个API。
这是由于媒体元数据通常必须在运行时异步加载,以防止媒体播放时的延迟,而某些元数据要求符合行业媒体标准。各个地区的一些法律还要求在特定方式中嵌入所有者和作者元数据。
AVFoundation中的中央Apple元数据项数据类型称为AVMetadataItem
。AVFoundation提供各种用于访问和写入AVMetadataItem
的API。
还存在一组用于访问AVMetadataItem
的AVMetadataItem
属性(键)。
每个AVFoundation媒体资产通过一个AVAsset
数据类型进行定义。
其中的轨道由Apple定义为AVAssetTrack
。
每个AVAsset
或轨道都可以连接一个或多个AVMetadataItem
。
您可以使用各种AVFoundation API在代码中创建AVAsset
对象,这些API可以从文件(例如QuickTime或.mp3文件)加载它们,甚至可以从Apple的HLS实时流加载它们。
还应该查看实现为AVFoundation协议AVAsynchronousKeyValueLoading
的异步媒体加载API。
一旦在代码中拥有AVAsset
或AVAssetTrack
对象,您可以随意操纵其元数据属性并将其写回其源。
AVFoundation是一个复杂的框架,其API有数百个键。
一开始,Spotlight元数据似乎是一个复杂的主题,但其API使用起来相当简单。CLI实用程序也简单易懂,经过一点练习就能理解。
使用这些工具,您可以轻松自定义和搜索跨所有已索引卷的Spotlight数据。