Entwickeln von IFilter-Add-Ins
Hinweis
Windows Desktop Search 2.x ist eine veraltete Technologie, die ursprünglich als Add-In für Windows XP und Windows Server 2003 verfügbar war. Verwenden Sie in späteren Versionen stattdessen Windows Search.
Sie können Microsoft Windows DesktopSuche (WDS) mit Filter-Add-Ins erweitern, d. h. Komponenten, die die IFilter-Schnittstelleimplementieren, um neue Dateitypen einzuschließt. Filter sind für den Zugriff auf und die Analyse von Daten in Dateien sowie für die Rückgabe von Paaren von Eigenschaften und Werten sowie Textblöcken für die Indizierung verantwortlich. Während des Indizierungsprozesses ruft WDS den entsprechenden Filter mit der URL für jede Datei oder jedes Element auf. Der Filter extrahiert zunächst Metadaten, die Eigenschaften entsprechen, die im WDS-Schema als abrufbar markiert sind, z. B. Titel, Dateigröße und Datum der letzten Änderung. Anschließend wird der Elementinhalt in Textblöcke aufgeteilt. WDS fügt dem Katalog die eigenschaften und den vom Filter zurückgegebenen Text hinzu. WDS kann jeden Dateityp indiziert, für den er über einen registrierten Filter verfügt.
In einigen Fällen müssen Sie keinen neuen Filter schreiben. WDS 2.x enthält Filter für über 200 Elementtypen (einschließlich Klartextelemente wie HTML-, XML- und Quellcodedateien) und verwendet die gleiche IFilter-Technologiewie SharePoint Services. Wenn Sie bereits Filter für Ihre Dateitypen installiert haben, kann WDS diese vorhandenen Filter verwenden, um diese Daten zu indizieren. Darüber hinaus enthält WDS einen allgemeinen Filter für Dateitypen, die klartextbasiert sind. Wenn Sie über einen Dateityp verfügen, der entweder von einem vorhandenen SharePoint Services- oder Klartextfilter verarbeitet werden kann, können Sie die Dateinamenerweiterung und die Filter-GUID zur Registrierung hinzufügen, damit WDS sie suchen und verwenden kann (weitere Informationen finden Sie unter Registrieren eines Filter-Add-Ins).
Wenn Sie jedoch über ein nicht klartextbasiertes und proprietäres Daten- oder Dateiformat verfügen, ist das Schreiben einer benutzerdefinierten Filterimplementierung die einzige Möglichkeit, sicherzustellen, dass WDS das Dateiformat im Katalog indizieren kann. Sie können nur ein Filter-Add-In für einen Dateityp verwenden, sodass es möglich ist, einen vorhandenen Filter zu überschreiben oder einen anderen Filter für einen bestimmten Dateityp außer Kraft setzen zu lassen.
Dieser Abschnitt enthält die folgenden Themen:
- Erforderliche Filterschnittstellen
- Ausgeben von Eigenschaften mit Filtern
- Installation des Filter-Add-Ins
- Zugehörige Themen
Erforderliche Filterschnittstellen
Ein Filter-Add-In muss die IFilter-Schnittstelleund eine der folgenden Schnittstellen implementieren:
- IPersistStream: Laden von Daten aus einem Stream. Dies ist sicherer als die Verwendung von Dateien, da nichts auf den Datenträger geschrieben wird. Die IPersistStream-Schnittstelle ist die bevorzugte Methode für die Vorwärtskompatibilität mit Windows Vista.
- IPersistFile-Schnittstelle: Laden von Daten aus einer Datei. Diese Schnittstelle wird in Windows Vista nicht unterstützt.
- IPersistStorage-Schnittstelle: Laden von Daten aus einem strukturierten OLE COM-Storage.
Ein Filter-Add-In verwendet diese Schnittstellen, um den Inhalt des Elements abzurufen und iterativ an den Index zurückzugeben, bis das Ende der Datei erreicht ist. Ein Filter-Add-In sollte so stabil wie möglich sein, um beschädigte Dateien und Dateien zu verarbeiten, die nicht den erwarteten Eingabeformaten entsprechen.
IFilter-Schnittstelle
Dies ist eine erforderliche Schnittstelle für eine Filterimplementierungen. Weitere Informationen finden Sie in der Referenz zur IFilter-Schnittstelle.
| Methode | BESCHREIBUNG |
|---|---|
| Init() | Initialisiert eine Filtersitzung. |
| GetChunk() | Positioniert den Filter am Anfang des ersten oder nächsten Blockes und gibt einen Deskriptor zurück. |
| GetText() | Ruft Text aus dem aktuellen Block ab. |
| GetValue() | Ruft Eigenschaftswerte aus dem aktuellen Block ab. |
| BindRegion() | Derzeit für die interne Verwendung reserviert; nicht implementieren. Diese Methode gibt E _ NOTIMPL zurück. |
Ipersiststream
Diese Schnittstelle lädt eine Datei aus einem Stream zur sichereren Verarbeitung als die IPersistFile-Schnittstelle, da der Kontext, in dem ein IPersistStream-Filter ausgeführt wird, keine Rechte zum Öffnen von Dateien auf dem Datenträger oder über das Netzwerk benötigt. Von den beiden Methoden für den Zugriff auf eine einzelne Datei ist dies die bevorzugte Methode für die Vorwärtskompatibilität mit Windows.
| Methode | BESCHREIBUNG |
|---|---|
| IsDirty() | Überprüft, ob eine Änderung aufgetreten ist. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| InitNew() | Erstellt einen neuen Speicher. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| Load() | Initialisiert ein Objekt aus dem Stream, in dem es zuvor gespeichert wurde. |
| Save() | Speichert ein Objekt im angegebenen Stream und gibt an, ob das Objekt sein geändertes Flag zurücksetzen soll. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| GetSizeMax() | Gibt die Größe des Streams in Bytes zurück, der für das Speichern des Objekts benötigt wird. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
Ipersistfile
Diese Schnittstelle lädt eine Datei nach absolutem Pfad und wird in Windows Vista nicht unterstützt.
| Methode | BESCHREIBUNG |
|---|---|
| GetCurFile() | Ruft den aktuellen Namen der Datei ab, die dem -Objekt zugeordnet ist. Gibt den in Load() angegebenen Pfad zurück. |
| Load() | Öffnet die angegebene Datei, und initialisiert ein Objekt aus dem Dateiinhalt. Sie können das Öffnen der Datei verzögern, bis Sie sie benötigen. |
| GetClassID() | Gibt den Klassenbezeichner (CLSID) für den neuen Dateityp zurück. Sie sollten uuidgen.exe verwenden, um eine eindeutige CLSID zu generieren. |
| IsDirty() | E NOTIMPL muss nur in Filtern zurückgegeben _ werden |
| Save() | E NOTIMPL muss nur in Filtern zurückgegeben _ werden |
| SaveCompleted() | E NOTIMPL muss nur in Filtern zurückgegeben _ werden |
IPersistStorage
Diese Schnittstelle unterstützt das strukturierte Speichermodell, in dem jedes enthaltene Objekt über einen eigenen Speicher verfügt, der im Speicher des Containers geschachtelt ist. Wie die IPersistFile-Schnittstellelädt diese Schnittstelle nach absolutem Pfad und wird in Windows Vista nicht unterstützt.
| Methode | BESCHREIBUNG |
|---|---|
| IsDirty() | Überprüft, ob eine Änderung durchgeführt wurde. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| InitNew() | Erstellt einen neuen Speicher. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| Load() | Speichert den Speicher. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| Save() | Gibt die Größe des Streams in Bytes zurück, der für das Speichern des Objekts benötigt wird. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| SaveCompleted() | Für die interne Verwendung reserviert. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
| HandsOffStorage() | Für die interne Verwendung reserviert. Diese Methode gibt E _ NOTIMPL in Filtern zurück. |
Ausgabe von Eigenschaften mit Filtern
Der Zweck eines Filters besteht im Extrahieren des Inhalts und der Eigenschaften von Dateien für die Aufnahme in den Volltextindex. WDS ruft zuerst die Load-Methode für die IPersistFile-, IPersistStream- oder IPersistStorage-Implementierung auf und ruft dann die Init-Methode der IFilter-Implementierung auf. GetChunk wird aufgerufen, um Text- oder Eigenschaftswertdaten in Teilen abzurufen. Anschließend wird entweder GetText oder GetValue so oft wie nötig aufgerufen, um alle dem Block zugeordneten Text- oder Eigenschaftswerte abzurufen. Dieser Vorgang wird wiederholt, bis GetChunk meldet, dass das Dokument keine blocks mehr enthält.
Die GetChunk-Methode ruft Informationen zum ersten oder nächsten logischen Informationsblock aus der gefilterten Datei ab und gibt diese Informationen in einer STAT CHUNK-Struktur zurück, einschließlich einer monoton zunehmenden Block-ID, Statusinformationen darüber, wie sich der aktuelle Block auf den vorherigen Block bezieht, ein Flag, das angibt, ob der Block Text oder einen Wert enthält, das Locale des Blocks und die Eigenschaftenspezifikation des _ Blocks. Die Eigenschaftenspezifikation ist eine FULLPROPSPEC, die aus einer CLSID und einem ganzzahligen oder Zeichenfolgen-Eigenschaftenbezeichner besteht (z. B. D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Sie identifiziert den Typ der Eigenschaft anstelle des Eigenschaftswerts selbst.
Der Block-Locale-Bezeichner wird verwendet, um eine geeignete Wörterpause zu wählen, und es ist sehr wichtig, dass Sie ihn richtig identifizieren. Wenn der Filter das Locale des Texts nicht bestimmen kann, sollte er das Standardsystem-Locale annehmen, das mit GetSystemDefaultLCID verfügbar ist. Wenn Sie das Dateiformat steuern und derzeit keine Informationen zum Locale enthalten, sollten Sie ein Benutzerfeature hinzufügen, um die ordnungsgemäße Identifizierung des Locale zu aktivieren. Die Verwendung einer nicht übereinstimmenden Wörterpause kann zu einer schlechten Abfrageerfahrung für den Benutzer führen.
GetChunk verwaltet nur den Zugriff auf Block und gibt nicht den Text- oder Eigenschaftswert selbst zurück. Stattdessen rufen nachfolgende Aufrufe von GetText und GetValue den Text des Blockes ab. GetText gibt Text chunks (Unicode-Zeichenfolgen) aus dem aktuellen CHUNK _ TEXT-Block zurück. Wenn der aktuelle Block zu groß ist, können mehrere Aufrufe der GetText-Methode erforderlich sein. Jeder Aufruf der GetText-Methode ruft Text ab, der unmittelbar auf den Text vom letzten Aufruf der GetText-Methode folgt. Beispielsweise kann das letzte Zeichen eines Aufrufs in der Mitte eines Worts sein, und das erste Zeichen im nächsten Aufruf würde dieses Wort fortsetzen. Suchmaschinen müssen diese Situation bewältigen.
GetValue gibt Eigenschaftswerte für den aktuellen CHUNK VALUE-Block in PROPVARIANT-Strukturen zurück, die eine Vielzahl _ von Datentypen enthalten können. GetValue muss die PROPVARIANT-Struktur selbst mithilfe von CoTaskMemAlloc zuordnen. Der Aufrufer von GetValue ist dafür verantwortlich, mithilfe von PropVariantClear Arbeitsspeicher frei zu geben, auf den die PROPVARIANT verweist, und die Struktur selbst mit CoTaskMemFree frei zu geben. Weitere Informationen zu PROPVARIANTs finden Sie in der PROPVARIANT-Referenz.
Eigenschaftswerte
Filter sollten mindestens die folgenden Eigenschaften aus geben, bei denen es sich um die Standardspalten in der WDS-Ergebnisansicht handelt.
| GUID | PROPSPEC | Anzeigename | BESCHREIBUNG |
|---|---|---|---|
| F29F85E0-4FF9-1068-AB91-08002B27B3D9 | 2 | PrimaryTitle | Titel, der für dieses Element angezeigt wird. |
| F29F85E0-4FF9-1068-AB91-08002B27B3D9 | 4 | PrimaryAuthors | Person, die diesem Element am meisten zugeordnet ist. |
| D5CDD505-2E9C-101B-9397-08002B2CF9AE | PrimaryDate | PrimaryDate | Das wichtigste Datum für das Element, z. B. das Datum, das für E-Mails empfangen oder für Dateien geändert wurde. |
| D5CDD505-2E9C-101B-9397-08002B2CF9AE | PerceivedType | PerceivedType | Typ der zu analysierenden Datei. Muss mit einem der unter WDS Windows Typ für die Desktopsuche aufgelisteten Typen übereinstimmen. |
Für Klartextelemente extrahiert WDS alle Text- und systemdefinierten Eigenschaften, z. B. Dateigröße oder Erweiterung, unter Einbeziehung neuer Klartextdateitypen in den Index. Weitere Typen von Eigenschaften, die an den Index zurückgegeben werden können, sind:
- Für Dateien: Autor, Titel, Status, Schlüsselwörter
- Für Medien: Album, Genre, Kamera machen, Datum aufgenommen
- Für die Kommunikation: from, to, cc, importance
- Für Kontakte: Stellenbezeichnung, Geschäftstelefon, Unternehmen
Die obige Liste enthält Eigenschaften, die einem angegebenen wahrgenommenen Typ gemeinsam sind. jede Eigenschaft kann jedoch unabhängig vom Typ verwendet werden. Beispielsweise könnte das Unternehmen für den Namen des Arbeitgebers eines Kontakts verwendet werden und auch verwendet werden, um auf den Namen eines Clients zu verweisen, auf den sich die Datei bezieht. Viele dieser Eigenschaften werden verwendet, um Suchergebnisse in der WDS-Ergebnisansicht anzuzeigen. Beispielsweise wird die Title-Eigenschaft einer Datei als Hauptspalte in der Standardergebnisansicht angezeigt. IFilter-Objekte sollten alle Eigenschaften im Zusammenhang mit dem Elementtyp, den sie analysen, aus geben. Benutzerdefinierte Eigenschaften können in WDS 2.x nicht hinzugefügt werden. Eine vollständige Liste der verfügbaren Eigenschaften finden Sie im WDS-Schema.
Filtern der Add-In-Installation
Die Installation des Filters umfasst das Kopieren der DLL an einen geeigneten Speicherort im Verzeichnis Programme und deren Registrierung. Filter sollten die Selbstregistrierung für die Installation implementieren und die folgenden Richtlinien befolgen:
- Das Installationsprogramm muss entweder EXE- oder MSI-Installationsprogramm verwenden.
- Versionshinweise müssen bereitgestellt werden.
- Für jedes installierte Add-In muss ein Eintrag Zum Hinzufügen/Entfernen von Programmen erstellt werden.
- Das Installationsprogramm muss alle Registrierungseinstellungen für den jeweiligen Dateityp oder Speicher übernehmen, den das aktuelle Add-In versteht.
- Wenn ein vorheriges Add-In überschrieben wird, sollte das Installationsprogramm den Benutzer benachrichtigen.
- Wenn ein neueres Add-In das vorherige Add-In überschrieben hat, sollte es die Möglichkeit geben, die Funktionalität des vorherigen Add-Ins wiederherzustellen und es wieder zum Standard-Add-In für diesen Dateityp oder -speicher zu machen.
Für die Registrierung erforderliche CLSIDs
Jedem Filter sind drei Klassenbezeichner (CLSIDs) zugeordnet. Sie müssen eines oder mehrere dieser Daten generieren (verwenden Sie uuidgen.exe), um Ihr Filter-Add-In zu registrieren.
- Der erste identifiziert den persistenten Handler aller Filter, IID _ IFilter, der {89BCB740-6119-101A-BCB7-00DD010655AF} ist. Diese CLSID ist für alle Filter konstant, die IFilter implementieren.
- Die zweite (der Wert des _ IFilter-Schlüssels der IID) identifiziert die IFilter-Implementierung für Ihren Dateityp. Dieser Schlüssel enthält einen InprocServer32-Wert, der den DLL-Namen nach Pfad und threading-Modell angibt. Wenn sich der Filter im Systempfad befindet, z. B. im Verzeichnis system32, ist ein Dateiname ausreichend. Andernfalls sollte dieser Wert eine vollständige Pfadspezifikation haben.
- Das dritte identifiziert den Dateityp, den der Filter verarbeitet, und wird von der GetClassID-Methode auf Ihrer IPersist-Schnittstelle zurückgegeben.
Hinweis
In zukünftigen Versionen von Microsoft-Betriebssystemen kann es schwieriger werden, Dateien im Verzeichnis system32 zu installieren. Daher wird empfohlen, sie unter Programme zu installieren und einen vollständigen Pfad zum Filter in die Registrierung zu integrieren. Aus Sicherheitsgründen ist es auch ratsam, einen vollständigen Pfad zu Ihrer DLL in der Registrierung anzugeben. Andernfalls könnte eine "Trojaner"-Version Ihrer DLL geladen werden, wenn sie sich im Prozesspfad vor Ihrer Version befindet.
Registrierungsmodell
Wenn WDS zum Filtern einer Datei bereit ist, wird in der Registrierung unter der Erweiterung der Datei gesucht, um zu bestimmen, welcher Filter geladen werden soll. Anschließend folgt er einer Reihe von Registrierungslinks, um den Namen der Filter-DLL in dieser Reihenfolge zu finden:
Von CLSIDs unter:
HKEY _ CURRENT _ USER \ SOFTWARE \ Microsoft \ RSSearch \ ContentIndexCommon \ Filters \ Override \ RSApp
HKEY _ CURRENT _ USER \ SOFTWARE \ Microsoft \ RSSearch \ ContentIndexCommon \ Filters
Geben Sie im Dateiinhaltstyp Folgendes ein:
HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Classes \ MIME \ Database \ Content Type
Über die Dateinamenerweiterung (identisch mit der Win32 LoadIFilter-API) unter:
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
Standardeinstellung:
HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ RSSearch \ ContentIndexCommon \ Filters
So registrieren Sie ein Filter-Add-In
Sie müssen insgesamt acht Einträge in der Registrierung vornehmen, um das Filter-Add-In zu registrieren, wobei Folgendes gilt:
- .ext ist die neue Dateinamenerweiterung.
- GUID _ 1 kann eine beliebige neue GUID sein, die für diese Erweiterung generiert wird.
- 89BCB740-6119-101A-BCB7-00DD010655AF ist die IFilter-Schnittstellen-GUID, die eine Konstante für alle IFilter-Implementierungen ist.
Registrieren Sie den persistenten Handler für die Dateinamenerweiterung mit den folgenden Schlüsseln und Werten:
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}Registrieren Sie die IFilter-Implementierung mit den folgenden Schlüsseln und Werten:
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 = BothRegistrieren Sie die IFilter-Implementierung bei Windows Desktopsuche mit dem folgenden Schlüssel und Wert:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext> (Default) = {CLSID of IFilter implementation}"
Zugehörige Themen
-
Referenz
-
Andere Ressourcen