Share via


Présentation des gestionnaires de filtres dans Windows Search

Les gestionnaires de filtre, qui sont des implémentations de l’interface IFilter , analysent les documents à la recherche de texte et de propriétés. Les gestionnaires de filtre extraient des blocs de texte de ces éléments, en filtrant la mise en forme incorporée et en conservant les informations sur la position du texte. Ils extraient également des blocs de valeurs, qui sont des propriétés de document. IFilter est la base de la création d’applications de niveau supérieur, telles que les indexeurs de documents et les visionneuses indépendantes de l’application.

Cette rubrique est organisée comme suit :

À propos de l’interface IFilter

Microsoft Windows Search utilise des filtres pour extraire le contenu des éléments à inclure dans un index de recherche en texte intégral. Vous pouvez étendre Windows Search pour indexer les types de fichiers nouveaux ou propriétaires en écrivant des filtres pour extraire le contenu et des gestionnaires de propriétés pour extraire les propriétés des fichiers.

L’interface IFilter est conçue pour répondre aux besoins spécifiques des moteurs de recherche en texte intégral. Les moteurs de recherche en texte intégral comme Recherche Windows appellent les méthodes IFilter pour extraire du texte et des informations sur les propriétés et les ajouter à un index. Recherche Windows décompose les résultats de la méthode IFilter::GetText retournée en mots, les normalise et les enregistre dans un index. S’il est disponible, le moteur de recherche utilise l’identificateur de code de langue (LCID) d’un bloc de texte pour effectuer la coupure de mots et la normalisation propres à la langue.

Windows Search utilise trois fonctions, décrites dans le tableau suivant, pour accéder aux gestionnaires de filtres inscrits (implémentations de l’interface IFilter ). Ces fonctions sont particulièrement utiles lors du chargement et de la liaison au gestionnaire de filtres d’un objet incorporé.

Fonction Description
LoadIFilter Obtient un pointeur vers le IFilter le plus approprié pour le type de contenu spécifié.
BindIFilterFromStorage Obtient un pointeur vers le IFilter le plus approprié pour le contenu contenu dans un objet IStorage Interface .
BindIFilterFromStream Obtient un pointeur vers l’IFilter le plus approprié pour un identificateur de classe spécifié (CLSID) récupéré à partir d’une variable de flux.

L’interface IFilter comporte cinq méthodes, décrites dans le tableau suivant.

Méthode Description
IFilter::Init Initialise une session de filtrage.
IFilter::GetChunk Positionne IFilter au début du premier ou du prochain bloc et retourne un descripteur.
IFilter::GetText Récupère le texte du bloc actuel.
IFilter::GetValue Récupère les valeurs du bloc actuel.
IFilter::BindRegion Récupère une interface représentant la partie spécifiée de l’objet. Réservé pour un usage futur.

Processus d’isolation

Recherche Windows exécute IFilters dans le contexte de sécurité du système local avec des droits restreints. Dans ce processus d’isolation de l’hôte IFilter , un certain nombre de droits sont supprimés :

  • Code restreint
  • Tout le monde
  • Local
  • Interactive
  • Utilisateurs authentifiés
  • Utilisateurs intégrés
  • Identificateur de sécurité (SID) des utilisateurs

La suppression de ces droits signifie que l’interface IFilter n’a pas accès au système de disque ou au réseau, ni aux fonctions d’interface utilisateur ou de Presse-papiers. En outre, le processus d’isolation s’exécute sous un objet de travail qui empêche la création de processus enfants et impose une limite de 100 Mo sur le jeu de travail. Le processus d’isolation de l’hôte d’interface IFilter augmente la stabilité de la plateforme d’indexation, en raison de la possibilité d’implémentation incorrecte de filtres tiers.

Notes

Les gestionnaires de filtres doivent être écrits pour gérer les mémoires tampons et s’empiler correctement. Toutes les copies de chaînes doivent avoir des vérifications explicites pour se protéger contre les dépassements de mémoire tampon. Vous devez toujours vérifier la taille allouée de la mémoire tampon. Vous devez toujours tester la taille des données par rapport à la taille de la mémoire tampon.

DLL IFilter

Ifilter Les DLL implémentent l’interface IFilter pour permettre à un client d’extraire du texte et des informations de valeur de propriété à partir d’un type de fichier, d’une classe ou d’un type perçu. Le processus de filtrage de Recherche Windows SearchFilterHost.exe est lié à l’IFilter qui est inscrit pour la classe, le type perçu ou l’extension de nom de l’élément.

IFilter, structure

Chaque IFilter est un fichier DLL qui implémente un serveur COM (Component Object Model) in-process pour fournir les fonctionnalités de filtrage spécifiées. La figure suivante illustre la structure globale d’une DLL IFilter standard. Un exemple plus complexe pourrait implémenter plusieurs classes IFilter .

diagramme de la structure d’une dll ifilter classique

Code natif

Les filtres doivent être écrits dans du code natif en raison de problèmes potentiels de contrôle de version du Common Language Runtime (CLR) avec le processus dans lequel plusieurs compléments s’exécutent. Dans Windows 7 et versions ultérieures, les filtres écrits en code managé sont explicitement bloqués.

Recherche de l’identificateur de classe IFilter

La classe de la DLL IFilter est inscrite sous la clé de Registre PersistentHandler. L’exemple suivant, pour les fichiers HTML, montre comment rechercher la DLL IFilter pour un document HTML. Cet exemple suit une logique similaire à celle utilisée par le système pour rechercher l’IFilter associé à un élément.

  1. Vérifiez si l’extension pour le type de fichiers que la DLL filtre a un PersistentHandler inscrit sous l’entrée de Registre \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Laissez cette clé être Value1. Si cette entrée existe déjà, passez à l’étape 4 de cette procédure et utilisez Value1 dans cette clé. Les valeurs sont de type REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Sinon, si aucun gestionnaire persistant n’est inscrit pour l’extension, recherchez le CLSID associé au type de document sous l’entrée de Registre \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Laissez cette clé être Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Déterminez si un Gestionnaire persistant est inscrit pour le CLSID. À l’aide de Value2 déterminé à l’étape 2, recherchez le Gestionnaire persistant pour l’entrée \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Laissez cette clé être Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Déterminez le GUID du gestionnaire persistant IFilter . À l’aide de Value1 et Value3, recherchez le GUID du gestionnaire persistant IFilter pour le type de document. La valeur sous l’entrée de Registre \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 ou 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DDD010655AF"/> génère le GUID IFilter PersistentHandler pour ce type de document. Laissez cette clé être Value4. Dans cet exemple, le GUID de l’interface IFilter est 89BCB740-6119-101A-BCB7-00DDD010655AF.
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {EEC97550-47A9-11CF-B952-00AA0051FE20}
                 = HTML File Persistent Handler
                    Data type         REG_SZ
                        PersistentAddinsRegistered
                        {89BCB740-6119-101A-BCB7-00DD010655AF}

                    Data type         REG_SZ
                        default = {E0CA5340-4534-11CF-B952-00AA0051FE20}

Notes

Dans cet exemple, la DLL IFilter pour les documents HTML est nlhtml.dll.

Identificateurs de code IFilter::GetChunk et régionaux

Le LCID du texte peut changer dans un seul fichier. Par exemple, le texte d’un manuel d’instructions peut alterner entre l’anglais (en-us) et l’espagnol (es) ou le texte peut inclure un seul mot dans une langue autre que la langue primaire. Dans les deux cas, votre IFilter doit commencer un nouveau bloc chaque fois que le LCID change. Étant donné que le LCID est utilisé pour choisir un analyseur lexical approprié, il est très important que vous l’identifiez correctement. Si l’IFilter ne peut pas déterminer les paramètres régionaux du texte, il doit retourner un LCID de zéro avec le bloc. Le renvoi d’un LCID de zéro entraîne l’utilisation de la technologie de détection automatique de langue (LAD) pour déterminer l’ID de paramètres régionaux du bloc. Si La recherche Windows ne trouve pas de correspondance, elle utilise par défaut les paramètres régionaux par défaut du système (en appelant la fonction GetSystemDefaultLocaleName ). Pour plus d’informations, consultez IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE et STAT_CHUNK.

Si vous contrôlez le format de fichier et qu’il ne contient actuellement pas d’informations de paramètres régionaux, vous devez ajouter une fonctionnalité utilisateur pour activer l’identification appropriée des paramètres régionaux. L’utilisation d’un analyseur lexicaux incompatible peut entraîner une expérience de requête médiocre pour l’utilisateur. Pour plus d’informations, consultez IWordBreaker.

Notes

Les filtres sont associés aux types de fichiers, comme indiqué par des extensions de nom de fichier, des types MIME ou des CLSID. Alors qu’un filtre peut gérer plusieurs types de fichiers, chaque type fonctionne avec un seul filtre.

Ressources supplémentaires

Développement de gestionnaires de filtres

Meilleures pratiques pour la création de gestionnaires de filtres dans Windows Search

Retour de propriétés à partir d’un gestionnaire de filtres

Gestionnaires de filtre fournis avec Windows

Implémentation de gestionnaires de filtres dans Windows Search

Inscription de gestionnaires de filtres

Test des gestionnaires de filtres