Informazioni sui gestori di filtri in Windows Search
Gestori di filtri, che sono implementazioni dell'interfaccia IFilter , analizzano i documenti per il testo e le proprietà. I gestori di filtri estraggono blocchi di testo da questi elementi, filtrando la formattazione incorporata e conservando le informazioni sulla posizione del testo. Estraono anche blocchi di valori, ovvero proprietà del documento. IFilter è la base per la creazione di applicazioni di livello superiore, ad esempio indicizzatori di documenti e visualizzatori indipendenti dall'applicazione.
Questo argomento è organizzato come segue:
- Informazioni sull'interfaccia IFilter
- Ricerca dell'identificatore della classe IFilter
- Risorse aggiuntive
- Argomenti correlati
Informazioni sull'interfaccia IFilter
Microsoft Windows Search usa filtri per estrarre il contenuto degli elementi per l'inclusione in un indice full-text. È possibile estendere Windows Search ai tipi di file nuovi o proprietari scrivendo filtri per estrarre il contenuto e i gestori delle proprietà per estrarre le proprietà dei file.
L'interfaccia IFilter è progettata per soddisfare le esigenze specifiche dei motori di ricerca full-text. I motori di ricerca full-text come Windows Search chiamano i metodi IFilter per estrarre informazioni di testo e proprietà e aggiungerle a un indice. Windows Search interrompe i risultati del metodo IFilter::GetText restituito in parole, li normalizza e li salva in un indice. Se disponibile, il motore di ricerca usa l'identificatore del codice del linguaggio (LCID) di un blocco di testo per eseguire interruzioni e normalizzazione della parola specifiche del linguaggio.
Windows Search usa tre funzioni, descritte nella tabella seguente, per accedere ai gestori di filtri registrati (implementazioni dell'interfaccia IFilter ). Queste funzioni sono particolarmente utili quando si caricano e si associano al gestore di filtri di un oggetto incorporato.
Funzione | Descrizione |
---|---|
LoadIFilter | Ottiene un puntatore al filtro IFilter più adatto per il tipo di contenuto specificato. |
BindIFilterFromStorage | Ottiene un puntatore al filtro IFilter più adatto per il contenuto contenuto contenuto in un oggetto IStorage Interface . |
BindIFilterFromStream | Ottiene un puntatore a IFilter più adatto per un identificatore di classe specificato (CLSID) recuperato da una variabile di flusso. |
L'interfaccia IFilter include cinque metodi, descritti nella tabella seguente.
Metodo | Descrizione |
---|---|
IFilter::Init | Inizializza una sessione di filtro. |
IFilter::GetChunk | Posiziona IFilter all'inizio del primo blocco o successivo e restituisce un descrittore. |
IFilter::GetText | Recupera il testo dal blocco corrente. |
IFilter::GetValue | Recupera i valori dal blocco corrente. |
IFilter::BindRegion | Recupera un'interfaccia che rappresenta la parte specificata dell'oggetto. Riservato per utilizzi futuri. |
Processo di isolamento
Windows Search esegue IFilter nel contesto di sicurezza del sistema locale con diritti limitati. In questo processo di isolamento host IFilter viene rimosso un numero di diritti:
- Codice con restrizioni
- Tutti
- Locale
- Interattività
- Utenti autenticati
- Utenti predefiniti
- Identificatore di sicurezza degli utenti (SID)
La rimozione di questi diritti significa che l'interfaccia IFilter non ha accesso al sistema del disco o alla rete o a qualsiasi interfaccia utente o funzioni degli Appunti. Inoltre, il processo di isolamento viene eseguito in un oggetto processo che impedisce la creazione dei processi figlio e impone un limite di 100 MB sul set di lavoro. il processo di isolamento dell'host dell'interfaccia IFilter aumenta la stabilità della piattaforma di indicizzazione, a causa della possibilità di implementare correttamente filtri di terze parti.
Nota
I gestori di filtri devono essere scritti per gestire i buffer e lo stack correttamente. Tutte le copie di stringa devono disporre di controlli espliciti per proteggere gli overrun del buffer. È consigliabile verificare sempre la dimensione allocata del buffer. È consigliabile testare sempre le dimensioni dei dati rispetto alle dimensioni del buffer.
DLL IFilter
Ifilter Le DLL implementano l'interfaccia IFilter per consentire a un client di estrarre informazioni sul valore del testo e della proprietà da un tipo di file, una classe o un tipo percepito. Il processo di filtro di Windows Search SearchFilterHost.exe associa al filtro IFilter registrato per la classe, il tipo percepito o l'estensione del nome dell'elemento.
Struttura IFilter
Ogni IFilter è un file DLL che implementa un server COM (Component Object Model) in-process per fornire le funzionalità di filtro specificate. La figura seguente illustra la struttura complessiva di una tipica DLL IFilter . Un esempio più complesso potrebbe implementare più di una classe IFilter .
Codice nativo
I filtri devono essere scritti nel codice nativo a causa di potenziali problemi di versioni CLR (Common Language Runtime) con il processo in cui vengono eseguiti più componenti aggiuntivi. In Windows 7 e versioni successive e versioni successive, i filtri scritti nel codice gestito vengono bloccati in modo esplicito.
Ricerca dell'identificatore della classe IFilter
La classe della DLL IFilter viene registrata nella chiave del Registro di sistema PersistentHandler. Nell'esempio seguente, per i file HTML, viene illustrato come trovare la DLL IFilter per un documento HTML. Questo esempio segue la logica simile a quella usata dal sistema per trovare IFilter associato a un elemento.
- Verificare se l'estensione per il tipo di file che i filtri DLL hanno un persistentHandler registrato nella voce del Registro di sistema \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Lasciare che questa chiave sia
Value1
. Se la voce esiste già, passare al passaggio 4 di questa procedura e usareValue1
in tale chiave. I valori sono di tipo REG_SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- In alternativa, se non è presente un gestore persistente registrato per l'estensione, trovare CLSID associato al tipo di documento nella voce del Registro di sistema \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Lasciare che questa chiave sia
Value2
.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
- Determinare se un persistentHandler è registrato per CLSID. Usando
Value2
determinato nel passaggio 2, trovare PersistentHandler per la voce \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Lasciare che questa chiave siaValue3
.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Determinare il GUID del gestore persistente IFilter . Usando
Value1
eValue3
, trovare il GUID del gestore persistente IFilter per il tipo di documento. Il valore nella voce del Registro di sistema \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 o 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> restituisce il GUID IFilter PersistentHandler per questo tipo di documento. Lasciare che questa chiave siaValue4
. In questo esempio il GUID dell'interfaccia IFilter è 89BCB740-6119-101A-BCB7-00DD010655AF.
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}
Nota
In questo esempio la DLL IFilter per i documenti HTML è nlhtml.dll.
Identificatori di codice IFilter::GetChunk e Impostazioni locali
LCID di testo può cambiare all'interno di un singolo file. Ad esempio, il testo di un manuale di istruzioni può alternarsi tra inglese (en-us) e spagnolo (es) o il testo può includere una singola parola in una lingua diversa dalla lingua primaria. In entrambi i casi, il filtro IFilter deve iniziare un nuovo blocco ogni volta che l'LCID cambia. Poiché l'LCID viene usato per scegliere un word breaker appropriato, è molto importante identificarlo correttamente. Se IFilter non riesce a determinare le impostazioni locali del testo, dovrebbe restituire un LCID di zero con il blocco. La restituzione di un LCID pari a zero causa l'uso della tecnologia Rilevamento automatico lingua (LAD) di Windows Search per determinare l'ID delle impostazioni locali del blocco. Se Windows Search non riesce a trovare una corrispondenza, viene predefinito nelle impostazioni locali predefinite del sistema (chiamando la funzione Funzione GetSystemDefaultLocaleName ). Per altre informazioni, vedere IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE e STAT_CHUNK.
Se si controlla il formato del file e attualmente non contiene informazioni sulle impostazioni locali, è necessario aggiungere una funzionalità utente per abilitare l'identificazione delle impostazioni locali appropriate. L'uso di un word breaker non corrispondente può causare una scarsa esperienza di query per l'utente. Per altre informazioni, vedere IWordBreaker.
Nota
I filtri sono associati ai tipi di file, come indicato dalle estensioni del nome file, dai tipi MIME o dai CLSID. Mentre un filtro può gestire più tipi di file, ogni tipo funziona con un solo filtro.
Risorse aggiuntive
- L'esempio di codice IFilterSample , disponibile in GitHub, illustra come creare una classe di base IFilter per implementare l'interfaccia IFilter .
- Per una panoramica del processo di indicizzazione, vedere Processo di indicizzazione.
- Per una panoramica dei tipi di file, vedere Tipi di file.
- Per eseguire query sugli attributi di associazione di file per un tipo di file, vedere PerceivedTypes, SystemFileAssociations e Application Registration.
Argomenti correlati
Procedure consigliate per la creazione di gestori di filtri in Windows Search
Restituzione di proprietà da un gestore di filtri
Gestori di filtri che vengono forniti con Windows
Implementazione dei gestori di filtri in Windows Search