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
- Recherche de l’identificateur de classe IFilter
- Ressources supplémentaires
- Rubriques connexes
À 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 .
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.
- 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 utilisezValue1
dans cette clé. Les valeurs sont de type REG_SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 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}
- 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é êtreValue3
.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Déterminez le GUID du gestionnaire persistant IFilter . À l’aide de
Value1
etValue3
, 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é êtreValue4
. 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
- L’exemple de code IFilterSample , disponible sur GitHub, montre comment créer une classe de base IFilter pour implémenter l’interface IFilter .
- Pour obtenir une vue d’ensemble du processus d’indexation, consultez Processus d’indexation.
- Pour obtenir une vue d’ensemble des types de fichiers, consultez Types de fichiers.
- Pour interroger les attributs d’association de fichiers d’un type de fichier, consultez PerceivedTypes, SystemFileAssociations et Inscription d’application.
Rubriques connexes
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