Вести с поисковых полей

В Mac OS 10.4, среди прочих новшеств, была внедрена технология поиска Spotlight, включающая индексирование и поиск по именам файлов, а также индексирование и поиск по метаданным. Для меня это значит примерно следующее: поскольку наш проект использует свой формат документов, представляя их в виде Mac OS bundles (т.е. документ представляет собой папку, в которой содержится описание структуры документа, а также хранятся использованные текстуры, материалы, 3D-объекты, представления и пр.), то автоматически Spotlight'овый поиск по нашим документам работать не будет. Чтобы справиться с этой проблемой, мне вчера довелось написать плагин для системы Spotlight - т.н. Spotlight Importer, который предоставляет данной системе метаданные наших документов в требуемом ей формате.

Об этом и речь. Для быстрого поиска информации в системе можно, как Microsoft, долго разрабатывать WinFS, и впоследствии отказаться от внедрения ее в новой версии Windows, а можно придумать Spotlight, поддержать поиск по стандартным форматам данных, и обязать разработчиков писать плагины для поиска по нестандартным форматам. Отличие в том, что второй подход уже реально работает на протяжении более чем полугода, а первый - нет, и неизвестно, когда WinFS будет-таки выпущена в свободное плавание.

Итак, Spotlight Importer. Его разработка сводится к реализации функции Boolean GetMetadataForFile(void* thisInterface, CFMutableDictionaryRef attributes, CFStringRef contentTypeUTI, CFStringRef pathToFile), которая принимает имя документа, созданного в нашем приложении, а возвращает ссылку на словарь метаданных attributes. Очевидно, что данная функция должна открыть документ, прочитать из него то, что может быть проиндексировано, и запихнуть это все в словарь attributes. Я уложился в набор стандартных ключей, используя:

  • kMDItemTitle - имя документа
  • kMDItemAuthors - массив, состоящий из имен авторов документа (у наших документов м.б. только 1 автор)
  • kMDItemDescription - описание документа

Нет, ну ведь правда здорово? Немедленно создаем документ spiralka и заполняем поля автор/копирайт/описание (кому не видно - имя автора "Zaycheg"):



Итак, что мы теперь найдем в Spotlight по запросу "zaycheg"? Конечно же, документ spiralka:



Не просто, а очень просто! Напоследок самое вкусное: как связать разработанный плагин с форматом документов. Иными словами - как сказать Spotlight'у, что для индексирования наших документов необходимо запустить наш плагин. Для этого в файл Info.plist приложения (содержит метаданные о приложении) необходимо указать тип (расширение) наших документов в формате UTI (Uniform Type Identifier). После первого запуска приложения Mac OS проанализирует его файл Info.plist, а затем всегда будет искать плагин для индексирования данного UTI в bundle приложения, и в системных папках Library. А плагин декларирует множество поддерживаемых UTI, и имеет собственный GUID, что гарантирует его уникальность в системе.

Ну красота ведь! До сих пор не нарадуюсь :)
А Microsoft пускай еще WinFS попишет.

0 коммент. | добавить комментарий :: Вести с поисковых полей

Отправить комментарий