Condividi tramite


Sviluppo di componenti aggiuntivi IFilter

Nota

Windows Desktop Search 2.x è una tecnologia obsoleta originariamente disponibile come componente aggiuntivo per Windows XP e Windows Server 2003. Nelle versioni successive usare invece Windows Search .

È possibile estendere Microsoft Windows Desktop Search (WDS) con componenti aggiuntivi di filtro, componenti che implementano l'interfaccia IFilter, per includere nuovi tipi di file. I filtri sono responsabili dell'accesso e dell'analisi dei dati nei file e della restituzione di coppie di proprietà e valori, nonché blocchi di testo per l'indicizzazione. Durante il processo di indicizzazione, WDS chiama il filtro appropriato con l'URL per ogni file o elemento. Il filtro estrae prima i metadati che corrispondono alle proprietà contrassegnate come recuperabili nello schema WDS, ad esempio titolo, dimensioni file e data dell'ultima modifica. Suddivide quindi il contenuto dell'elemento in blocchi di testo. WDS aggiunge le proprietà e il testo restituiti dal filtro al catalogo. WDS può indicizzare qualsiasi tipo di file per il quale ha un filtro registrato.

In alcune circostanze, non è necessario scrivere un nuovo filtro. WDS 2.x contiene filtri per oltre 200 tipi di elementi (inclusi elementi di testo non crittografato, ad esempio file HTML, XML e codice sorgente) e usa la stessa tecnologia IFilterdi SharePoint Services. Se sono già stati installati filtri per i tipi di file, WDS può usare tali filtri esistenti per indicizzare questi dati. WdS include inoltre un filtro generale per i tipi di file basati su testo non crittografato. Se si dispone di un tipo di file che può essere elaborato da un filtro SharePoint Services esistente o dal filtro di testo non crittografato, è possibile aggiungere l'estensione del nome file e filtrare GUID al Registro di sistema in modo che WDS possa individuarlo e usarlo (vedere Registrare un componente aggiuntivo filtro per altre informazioni).

Se, tuttavia, si dispone di un formato di dati o file non non crittografato e proprietario, la scrittura di un'implementazione di filtro personalizzata è l'unico modo per garantire che WDS possa indicizzare il formato di file nel catalogo. È possibile disporre di un solo componente aggiuntivo filtro per un tipo di file, quindi è possibile eseguire l'override di un filtro esistente o di avere un altro filtro di override per un tipo di file specifico.

Questa sezione contiene i seguenti argomenti:

Interfacce di filtro necessarie

Un componente aggiuntivo filtro deve implementare l'interfaccia IFiltere una delle interfacce seguenti:

  • IPersistStream : per caricare i dati da un flusso. Questo è più sicuro dell'uso dei file perché non viene scritto nulla su disco. L'interfaccia IPersistStream è il metodo preferito per la compatibilità con Windows Vista.
  • Interfaccia IPersistFile : per caricare i dati da un file. Questa interfaccia non è supportata in Windows Vista.
  • Interfaccia IPersistStorage : per caricare i dati da un'archiviazione strutturata OLE COM.

Un componente aggiuntivo filtro usa queste interfacce per ottenere il contenuto dell'elemento e restituirli in modo iterativo all'indice fino alla fine del file. Un componente aggiuntivo filtro deve essere il più affidabile possibile per gestire i file danneggiati e quelli che non soddisfano i formati di input previsti.

Interfaccia IFilter

Si tratta di un'interfaccia necessaria per un'implementazione del filtro. Per altre informazioni, vedere informazioni di riferimento sull'interfaccia IFilter.

Metodo Descrizione
Init() Inizializza una sessione di filtro.
GetChunk() Posiziona il filtro all'inizio del primo o del blocco successivo e restituisce un descrittore.
GetText() Recupera il testo dal blocco corrente.
GetValue() Recupera i valori delle proprietà dal blocco corrente.
BindRegion() Attualmente riservato per l'uso interno; non implementare. Questo metodo restituisce E_NOTIMPL.

 

Ipersiststream

Questa interfaccia carica un file da un flusso per un'elaborazione più sicura rispetto all'interfaccia IPersistFile perché il contesto in cui viene eseguito un filtro IPersistStream non ha bisogno dei diritti per aprire i file sul disco o sulla rete. Dei due metodi per l'accesso a un singolo file, questo è il metodo preferito per la compatibilità con Windows.

Metodo Descrizione
IsDirty() Verifica se è stata apportata una modifica. Questo metodo restituisce E_NOTIMPL nei filtri.
InitNew() Crea una nuova risorsa di archiviazione. Questo metodo restituisce E_NOTIMPL nei filtri.
Load() Inizializza un oggetto dal flusso in cui è stato salvato in precedenza.
Save() Salva un oggetto nel flusso specificato e indica se l'oggetto deve reimpostare il flag sporco. Questo metodo restituisce E_NOTIMPL nei filtri.
GetSizeMax() Restituisce la dimensione, in byte, del flusso necessario per salvare l'oggetto. Questo metodo restituisce E_NOTIMPL nei filtri.

 

Ipersistfile

Questa interfaccia carica un file in base al percorso assoluto e non è supportato in Windows Vista.

Metodo Descrizione
GetCurFile() Ottiene il nome corrente del file associato all'oggetto. Restituisce il percorso specificato in Load().
Load() Apre il file specificato e inizializza un oggetto dal contenuto del file. È possibile ritardare l'apertura del file fino a quando non è necessario.
GetClassID() Restituisce l'identificatore di classe (CLSID) per il nuovo tipo di file. È consigliabile usare uuidgen.exe per generare un CLSID univoco.
IsDirty() È necessario restituire solo E_NOTIMPL nei filtri
Save() È necessario restituire solo E_NOTIMPL nei filtri
SaveCompleted() È necessario restituire solo E_NOTIMPL nei filtri

 

IPersistStorage

Questa interfaccia supporta il modello di archiviazione strutturato, in cui ogni oggetto contenuto ha una propria risorsa di archiviazione annidata all'interno dell'archiviazione del contenitore. Come L'interfaccia IPersistFile, questa interfaccia viene caricata per percorso assoluto e non è supportata in Windows Vista.

Metodo Descrizione
IsDirty() Controlla se è stata apportata una modifica. Questo metodo restituisce E_NOTIMPL nei filtri.
InitNew() Crea una nuova risorsa di archiviazione. Questo metodo restituisce E_NOTIMPL nei filtri.
Load() Salva lo spazio di archiviazione. Questo metodo restituisce E_NOTIMPL nei filtri.
Save() Restituisce la dimensione, in byte, del flusso necessario per salvare l'oggetto. Questo metodo restituisce E_NOTIMPL nei filtri.
SaveCompleted() Riservato per utilizzo interno. Questo metodo restituisce E_NOTIMPL nei filtri.
HandsOffStorage() Riservato per utilizzo interno. Questo metodo restituisce E_NOTIMPL nei filtri.

 

Output delle proprietà con filtri

Lo scopo di un filtro è estrarre il contenuto e le proprietà dei file per l'inclusione nell'indice full-text. WdS chiama innanzitutto il metodo Load nelle implementazioni IPersistFile, IPersistStream o IPersistStorage e quindi richiama il metodo Init dell'implementazione IFilter. GetChunk viene chiamato per recuperare blocchi di dati di valore di testo o proprietà e quindi viene chiamato GetText o GetValue quante volte necessario per recuperare tutti i valori di testo o proprietà associati al blocco. Questo processo viene ripetuto fino a quando GetChunk segnala che non sono presenti altri blocchi nel documento.

Il metodo GetChunk recupera informazioni sul primo o successivo blocco logico di informazioni dal file filtrato e restituisce tali informazioni in una struttura di STAT_CHUNK, incluso un ID blocco che aumenta in modo monotonico, informazioni sullo stato sul modo in cui il blocco corrente è correlato al blocco precedente, un flag che indica se il blocco contiene testo o un valore, le impostazioni locali del blocco e la specifica della proprietà del blocco. La specifica della proprietà è FULLPROPSPEC costituita da un CLSID e da un identificatore di proprietà integer o stringa (ad esempio, D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Identifica il tipo di proprietà anziché il valore della proprietà stessa.

L'identificatore delle impostazioni locali del blocco viene usato per scegliere un word breaker appropriato ed è molto importante identificarlo correttamente. Se il filtro non è in grado di determinare le impostazioni locali del testo, deve presupporre le impostazioni locali di sistema predefinite, disponibili usando GetSystemDefaultLCID. Se si controlla il formato di file e attualmente non contiene informazioni sulle impostazioni locali, è necessario aggiungere una funzionalità utente per abilitare l'identificazione delle impostazioni locali appropriata. L'uso di un word breaker non corrispondente può causare un'esperienza di query non valida per l'utente.

GetChunk gestisce solo l'accesso ai blocchi e non restituisce il testo o il valore della proprietà stesso. Le chiamate successive a GetText e GetValue recuperano invece il corpo del blocco. GetText restituisce blocchi di testo, ovvero stringhe Unicode, dal blocco corrente CHUNK_TEXT. Se il blocco corrente è troppo grande, è possibile richiedere più chiamate al metodo GetText . Ogni chiamata al metodo GetText recupera il testo che segue immediatamente il testo dall'ultima chiamata al metodo GetText . Ad esempio, l'ultimo carattere di una chiamata può trovarsi al centro di una parola e il primo carattere nella chiamata successiva continuerà tale parola. I motori di ricerca devono gestire questa situazione.

GetValue restituisce i valori delle proprietà per il blocco di CHUNK_VALUE corrente nelle strutture PROPVARIANT, che possono contenere un'ampia gamma di tipi di dati. GetValue deve allocare la struttura PROPVARIANT stessa usando CoTaskMemAlloc. Il chiamante di GetValue è responsabile della liberazione della memoria a cui punta il PROPVARIANT usando PropVariantClear e per liberare la struttura stessa con CoTaskMemFree. Per altre informazioni sui PROPVARIANT, vedere le informazioni di riferimento su PROPVARIANT .

Valori della proprietà

I filtri devono restituire almeno le proprietà seguenti, ovvero le colonne predefinite nella visualizzazione dei risultati wds.

GUID PROPSPEC Nome descrittivo Descrizione
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 PrimaryTitle Titolo visualizzato per questo elemento.
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 PrimaryAuthors Persona più associata a questo elemento.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimaryDate PrimaryDate Data più importante per l'elemento, ad esempio la data ricevuta per la posta elettronica o modificata per i file.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PerceivedType PerceivedType Tipo di file analizzato. Deve corrispondere a uno dei tipi di Ricerca desktop di Windows elencati nel tipo percepito wdS.

 

Per gli elementi di testo non crittografato, WDS estrae tutte le proprietà di testo e definite dal sistema, ad esempio le dimensioni o l'estensione del file, inclusi i nuovi tipi di file di testo non crittografato all'indice. Altri tipi di proprietà che possono essere restituiti all'indice includono:

  • Per i file: author, title, status, keywords
  • Per i media: album, genere, macchina fotografica, data ripresa
  • Per le comunicazioni: da, a, cc, importanza
  • Per i contatti: titolo di lavoro, telefono aziendale, azienda

L'elenco precedente raggruppa le proprietà comuni a un tipo percepito specificato; Tuttavia, qualsiasi proprietà può essere utilizzata indipendentemente dal tipo . Ad esempio, l'azienda può essere usata per il nome del datore di lavoro di un contatto e può anche essere usata per fare riferimento al nome di un cliente a cui si riferisce il file. Molte di queste proprietà vengono usate per visualizzare i risultati della ricerca nella visualizzazione dei risultati di Servizi di distribuzione Windows. Ad esempio, la proprietà Title di un file viene visualizzata come colonna principale nella visualizzazione dei risultati predefinita. Gli oggetti IFilter devono restituire tutte le proprietà correlate al tipo di elemento che stanno analizzando. Impossibile aggiungere proprietà personalizzate in WDS 2.x. Per un elenco completo delle proprietà disponibili, vedere schema WDS.

Filtrare l'installazione del componente aggiuntivo

L'installazione del filtro comporta la copia della DLL in un percorso appropriato nella directory Programmi e la registrazione. I filtri devono implementare la registrazione automatica per l'installazione e devono seguire queste linee guida:

  • Il programma di installazione deve usare il programma di installazione EXE o MSI.
  • È necessario specificare le note sulla versione.
  • È necessario creare una voce Installazione applicazioni per ogni componente aggiuntivo installato.
  • Il programma di installazione deve assumere tutte le impostazioni del Registro di sistema per il tipo di file specifico o archiviare che il componente aggiuntivo corrente riconosce.
  • Se un componente aggiuntivo precedente viene sovrascritto, il programma di installazione deve inviare una notifica all'utente.
  • Se un componente aggiuntivo più recente ha sovrascritto il componente aggiuntivo precedente, dovrebbe essere possibile ripristinare la funzionalità del componente aggiuntivo precedente e renderlo nuovamente il componente aggiuntivo predefinito per il tipo di file o l'archivio.

CLSID obbligatorio per la registrazione

A ogni filtro sono associati tre identificatori di classe o CLSID. È necessario generare uno o più di questi (usare uuidgen.exe) per registrare il componente aggiuntivo del filtro.

  • Il primo identifica il gestore permanente di tutti i filtri, IID_IFilter, ovvero {89BCB740-6119-101A-BCB7-00DD010655AF}. Questo CLSID è costante per tutti i filtri che implementano IFilter.
  • Il secondo (il valore della chiave IID_IFilter) identifica l'implementazione IFilter per il tipo di file. Questa chiave contiene un valore InprocServer32 che specifica il nome della DLL in base al percorso e al modello di threading. Se il filtro si trova nel percorso di sistema, ad esempio la directory system32, è sufficiente un nome di file. In caso contrario, questo valore deve avere una specifica di percorso completa.
  • Il terzo identifica il tipo di file dei processi di filtro e viene restituito dal metodo GetClassID nell'interfaccia IPersist.

Nota

Nelle versioni future dei sistemi operativi Microsoft, l'installazione dei file nella directory system32 potrebbe risultare più difficile, quindi è consigliabile installarli in Programmi e includere un percorso completo per il filtro nel Registro di sistema. Per motivi di sicurezza, è anche consigliabile specificare un percorso completo della DLL nel Registro di sistema. In caso contrario, potrebbe essere caricata una versione "Cavallo di Trojan" della DLL se si verifica nel percorso del processo prima della versione.

 

Modello di registrazione

Quando WDS è pronto per filtrare un file, cerca nel Registro di sistema sotto l'estensione del file per determinare quale filtro caricare. Segue quindi una serie di collegamenti del Registro di sistema per trovare il nome della DLL del filtro, in questo ordine:

  1. Dai CLSID disponibili in:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. Dal tipo di contenuto del file in:

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. Dall'estensione del nome file (uguale all'API LoadIFilter Win32) in:

    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>>>

  4. Da Impostazione predefinita in:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

Per registrare un componente aggiuntivo filtro

È necessario creare un totale di otto voci nel Registro di sistema per registrare il componente aggiuntivo filtro, dove:

  • .ext è la nuova estensione del nome file
  • GUID_1 può essere generato qualsiasi nuovo GUID per questa estensione
  • 89BCB740-6119-101A-BCB7-00DD010655AF è il GUID dell'interfaccia IFilter, che è una costante per tutte le implementazioni di IFilter.
  1. Registrare il gestore permanente per l'estensione del nome file con le chiavi e i valori seguenti:

    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}
    
  2. Registrare l'implementazione di IFilter con le chiavi e i valori seguenti:

    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 = Both
    
  3. Registrare l'implementazione di IFilter con Windows Desktop Search con la chiave e il valore seguenti:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

Riferimento

SchemaTable

Tipi percepiti

Sviluppo di gestori di protocolli

Altre risorse

Ifilter