Skip to main content

 

Метаданные в центре внимания.

Spotlight — это интеллектуальный поисковый индексатор Apple для macOS. Вот как можно использовать утилиты метаданных, чтобы получить дополнительную информацию о ваших документах.

Spotlight работает в фоновом режиме на вашем Mac или устройстве iOS и автоматически индексирует и сканирует содержимое ваших документов, поэтому, когда вы что-то ищете, он может быстро найти результаты.

Основной фоновый демон в Spotlight называется corespotlightd, и при полной нагрузке он может потреблять до 8–10 % процессорного времени.

На компьютерах Apple Silicon Mac corespotlightd может запускать до четырех потоков одновременно во время пиковой фоновой индексации.

Если вы разработчик Apple, вы можете добавить платформу Core Spotlight в свое приложение и заставить ее индексировать содержимое вашего приложения внутри компании, чтобы контент автоматически стал доступен пользователям приложения.

В платформе Foundation имеются дополнительные API-интерфейсы Spotlight, которые позволяют выполнять локальный поиск по данным Spotlight из вашего приложения.

Вы также захотите добавить Core Services.framework в свой проект Xcode, поскольку именно там находятся API-интерфейсы метаданных файлов.

Существуют также функции iCloud Spotlight, которые мы здесь не будем рассматривать.

CoreSpotlight.framework

Добавьте CoreSpotlight.framework в Xcode.

Настройка томов, которые будут индексироваться

В macOS вы можете указать, какие тома вы хотите индексировать Spotlight, а какие нет. По умолчанию, если вы не исключите тома из Spotlight, они будут проиндексированы.

Если вы исключите тома из индекса Spotlight, их содержимое не будет отображаться при поиске Spotlight.

Если на диске вашего Mac имеется несколько томов или к вам подключены внешние диски, вы можете включить или отключить Spotlight (и Siri) на каждом из них.

Для этого сначала откройте «Системные настройки» в macOS, выбрав «Системные настройки» в меню Apple в строке меню Finder.

В левой части окна «Системные настройки» прокрутите вниз и нажмите «Siri & Spotlight». На панели Siri и Spotlight вы можете включать и выключать Siri, устанавливать сочетание клавиш, устанавливать язык и то, как Siri обрабатывает историю.

Ниже находится раздел «В центре внимания». Здесь вы можете указать, какие типы документов вы хотите индексировать Spotlight.

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

Если вы прокрутите панель до конца, вы увидите кнопку с надписью «Конфиденциальность Spotlight». Нажмите на нее, чтобы открыть лист конфиденциальности.

Настройки Spotlight в macOS.

Панель настроек Siri и Spotlight.

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

Чтобы добавить или удалить тома на листе конфиденциальности, вы можете перетащить их в него или из него либо нажать кнопки + или – под списком.

Конфиденциальность в центре внимания.

Лист конфиденциальности Spotlight.

Как только том добавляется в список, Spotlight перестает его индексировать.

Когда список исключений конфиденциальности вас устроит, нажмите «Готово», чтобы закрыть лист. Закройте настройки системы.

Когда corespotlightd индексирует данные ваших томов, он ищет содержимое файлов, а также ищет и индексирует метаданные. Метаданные можно определить как информационные данные, связанные с файлами, но не содержащиеся в самих файлах.

Метаданные включают (но не ограничиваются) такие данные, как дата создания и последнего изменения файла, размер, версия, тип, имя и комментарии Finder, отображаемые в окнах получения информации.

Spotlight использует API метаданных файлов в платформе основных служб Apple для поиска и чтения метаданных.

В API метаданных файлов есть четыре основных типа данных:

MDSchema MDItem MDLabelDomain MDQuerySortOptionFlags

Мы не будем вдаваться во все подробности типов данных, но основным типом, в котором хранится ссылка на элемент файловой системы и его метаданные, является тип MDItem.

Используя API-интерфейсы MDItem и Core Services, вы можете получать, сортировать и хранить метаданные для элементов в локальных файловых системах.

Импортеры в центре внимания

Если вы откроете папку /Library/Spotlight на загрузочном диске вашего Mac, вы можете заметить один или несколько файлов с расширением .mdimporter. Это плагины импорта метаданных Spotlight.

Например, страницы Apple и оригинальные приложения iBooks Author имеют плагины .mdimporter. То же самое можно сказать и о некоторых приложениях Microsoft 365. Другие приложения также предоставляют их.

Вы можете написать собственные плагины .mdimporter в Apple Xcode, поместить их в папку /Library, и Spotlight будет использовать их для импорта метаданных из файлов, поддерживаемых вашими приложениями.

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

У Apple также есть (немного более старый) документ для разработчиков под названием «Руководство по программированию Spotlight Importer», в котором показано, как написать .mdimporter.

Файл .mdimporter в macOS.

Плагин .mdimporter Spotlight.

Apple и сторонние компании также предоставляют несколько инструментов командной строки (CLI), которые вы можете использовать в приложении «Терминал» macOS для доступа к метаданным Spotlight в объектах файловой системы, хранящихся на ваших устройствах.

Spotlight хранит индексированные метаданные в локальной базе данных на каждом подключенном дисковом томе. Базы данных метаданных Spotlight называются хранилищами.

Каждое хранилище содержит индексированные метаданные для каждого объекта файловой системы, а также некоторые дополнительные данные, которые ускоряют поиск Spotlight. Сохраняя и обновляя метаданные файлов в отдельной базе данных, Spotlight может искать и извлекать данные гораздо быстрее, поскольку ему не нужно каждый раз проходить иерархию файловой системы.

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

Доступно множество команд утилиты Spotlight CLI, но вам, скорее всего, захочется использовать четыре ключевых:

mdutil mdimport mdls mdfind

Вы можете получить информацию об использовании любой из них в Терминале, открыв Терминал, затем набрав man, затем пробел, имя утилиты, а затем нажав Return на клавиатуре.

Обратите внимание, что для некоторых команд после имени команды требуется параметр файловой системы, а для некоторых нет. Например, mdutil этого не делает, а mdattributes делает.

Чтобы выйти из ручной (ручной) системы в Терминале, нажмите Control-Z на клавиатуре.

mdutil

Команда mdutil — это простая утилита, которая помогает управлять хранилищами метаданных Spotlight на вашем Mac. Обратите внимание, что том должен быть смонтирован на рабочем столе в Finder, чтобы mdutil мог работать с ним.

Например, с помощью mdutil вы можете включать и отключать хранилища Spotlight для определенных томов, отключать поиск на этом томе, стирать хранилище для тома, отображать статус индексирования Spotlight для тома и многое другое.

Вы также можете применять определенные команды к хранилищам Spotlight на каждом индексированном томе и очищать кэши хранилища Spotlight, чтобы принудительно использовать само хранилище напрямую.

Введите man mdutil и нажмите Return на клавиатуре в Терминале, чтобы полностью использовать mdutil.

mdimport

mdimport — это утилита CLI Spotlight, которая позволяет вручную импортировать все доступные для поиска метаданные из иерархии файловой системы в хранилище метаданных Spotlight. Он использует упомянутые выше плагины .mdimporter для импорта и поиска данных.

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

Вы также можете использовать mdimport для тестирования плагинов .mdimporter, которые пишете вы или ваша команда.

Введите man mdimport и нажмите Return на клавиатуре в Терминале, чтобы полностью использовать mdimport.

mdls

mdls — это утилита, которая перечисляет атрибуты метаданных для одного файла на диске, используя предопределенный ключ метаданных (или «тег»). Apple определяет большинство ключей метаданных, используемых Spotlight, но если вы напишете свой собственный .mdimporter, вы сможете определить свои собственные ключи.

Введите man mdls и нажмите Return на клавиатуре в Терминале, чтобы использовать mdls.

mdfind

mdfind — это гибкая и мощная утилита, которая позволяет вам находить все объекты в иерархии файловой системы, соответствующие указанным вами метаданным, путем поиска в хранилищах Spotlight на определенном томе.

Используя различные параметры mdfind, вы можете начать поиск в определенном месте в иерархии файловой системы, указать, какие элементы метаданных следует сопоставить, и указать конкретные имена файлов для сопоставления.

mdfind вернет только результаты файлов, соответствующих указанным вами критериям поиска.

Вы можете отменить поиск mdfind во время его выполнения, набрав Control-C на клавиатуре.

В mdfind также есть флаг -interpret, который позволяет вам указать строку на естественном языке так же, как если бы вы ввели ее в Spotlight в Finder. mdfind интерпретирует строку и соответствующим образом скорректирует поиск.

Вы также можете комбинировать mdfind с другими стандартными утилитами UNIX, такими как grep, для выполнения сложного поиска и передачи результатов на стандартный вывод, в том числе в файл.

Введите man mdfind и нажмите Return на клавиатуре в Терминале, чтобы использовать mdfind.

Есть несколько дополнительных утилит Spotlight, не упомянутых здесь, о которых мы расскажем в следующей статье.

Ключи атрибутов

Метаданные файлов Spotlight и Core Services сохраняют каждый элемент метаданных в хранилище с использованием уникального ключа или строки. Каждый ключ сообщает Spotlight и API, какой элемент метаданных вас интересует.

Apple определяет ключи метаданных как строки Core Foundation типа CFString — распространенный тип строки Core Foundation, используемый почти во всем программном обеспечении, связанном с Apple. Используя Core Foundation API, вы также можете манипулировать CFStrings непосредственно из кода.

Apple перечисляет большинство ключей атрибутов метаданных в документации API метаданных файлов, упомянутой выше. Большинство ключей начинаются с префикса kMD (сокращение от «константа» — «метаданные»).

Чтобы использовать API метаданных файлов, вы обычно используете одну из его функций или одну из функций Spotlight и указываете ключ метаданных, чтобы указать, какую часть информации метаданных вы хотите использовать. Ключи можно использовать как при получении, так и при записи метаданных.

Например, в Swift ключ API метаданных для элемента метаданных «дата добавления» для любого объекта файловой системы определяется как:

пусть kMDItemDateAdded: CFString!

const CFStringRef kMDItemDateAdded;

(В Objective-C CFStringRef — это непрозрачный тип Core Foundation для CFString).

Если вы разработчик Apple и используете API метаданных файлов, вы часто будете использовать ключи метаданных.

Для аудио/видео медиафайлов Apple предоставляет один дополнительный API в рамках AVFoundation.

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

Центральный тип данных элемента метаданных Apple в AVFoundation называется AVMetadataItem. AVFoundation предоставляет различные API для доступа и записи AVMetadataItem.

Существует также соответствующий набор атрибутов AVMetadataItem (ключей), используемых для доступа к AVMetadataItem.

Каждый медиа-ресурс AVFoundation определяется типом данных AVAsset.

Дорожки внутри каждого ресурса определяются Apple как AVAssetTrack.

К каждому AVAsset или дорожке может быть прикреплен один или несколько AVMetadataItem.

Вы можете создавать объекты AVAsset в коде, используя различные API AVFoundation, которые могут загружать их из файла (например, файла QuickTime или .mp3) или даже из прямого потока Apple HLS.

Вам также следует ознакомиться с API асинхронной загрузки мультимедиа, реализованным в виде протокола AVFoundation AVAsynchronousKeyValueLoading.

Если у вас есть объект AVAsset или AVAssetTrack в коде, вы можете по своему усмотрению манипулировать его атрибутами метаданных и записывать их обратно в источник.

AVFoundation — это сложный фреймворк, для которого существуют сотни ключей API.

Метаданные Spotlight на первый взгляд кажутся сложной темой, но их API довольно прост в использовании. Утилиты CLI также просты и понятны после небольшой практики.

Используя эти инструменты, вы можете без особых усилий настраивать и выполнять поиск данных Spotlight по всем проиндексированным томам.