Sviluppo di gestori di proprietà per Windows Search

Microsoft Windows Search usa gestori di proprietà per estrarre i valori delle proprietà dagli elementi e usa lo schema del sistema di proprietà per determinare come indicizzare una proprietà specifica. Per leggere e indicizzare i valori delle proprietà, i gestori di proprietà vengono richiamati out-of-process da Windows Search per migliorare la sicurezza e l'affidabilità. Al contrario, i gestori delle proprietà vengono richiamati in-process da Esplora risorse per leggere e scrivere i valori delle proprietà.

Questo argomento integra l'argomento Sistema proprietà con informazioni specifiche di Windows Search e contiene le sezioni seguenti:

 

Decisioni di progettazione per gestori di proprietà

L'implementazione dei gestori di proprietà prevede i passaggi seguenti:

  1. Prendere decisioni di progettazione relative alle proprietà che si desidera supportare.
  2. Creazione di un file Descrizione proprietà (con estensione propdesc) per le proprietà non già presenti nel sistema di proprietà.
  3. Implementazione e test del gestore delle proprietà.
  4. Installazione e registrazione del gestore delle proprietà e dei file di descrizione delle proprietà.
  5. Test dell'installazione e della registrazione del gestore delle proprietà.

Prima di iniziare, è necessario considerare le domande di progettazione seguenti:

  • Quali proprietà supportano/devono supportare il formato di file?
  • Queste proprietà sono già presenti nello schema di sistema?
  • È possibile usare un gestore di proprietà fornito dal sistema esistente?
  • Quali proprietà possono essere visualizzate agli utenti finali?
  • Quali proprietà possono essere modificate dagli utenti?
  • Il supporto per la ricerca full-text deve provenire da un gestore di proprietà o da un filtro?
  • È necessario supportare le applicazioni legacy? In tal caso, cosa si implementa?

Nota

Prima di continuare, vedere Uso dei gestori di proprietà forniti dal sistema per verificare se è possibile usare un gestore di proprietà fornito dal sistema, risparmiando tempo e risorse di sviluppo.

 

Dopo aver preso queste decisioni, è possibile scrivere descrizioni formali delle proprietà personalizzate in modo che il motore di Windows Search possa iniziare a indicizzare i file e le proprietà. Queste descrizioni formali sono file XML, descritti in Property Description Schema.

Decisioni relative alle proprietà

Quando si considerano le proprietà da supportare, è necessario identificare le esigenze di indicizzazione e ricerca degli utenti. Ad esempio, potresti essere in grado di identificare cento proprietà potenzialmente utili per il tipo di file, ma gli utenti potrebbero essere interessati a cercare solo una manciata. Inoltre, potresti voler visualizzare un gruppo diverso, più grande o più piccolo, di tali proprietà agli utenti in Esplora risorse e consentire agli utenti di modificare solo un subset di tali proprietà visualizzate.

Il tipo di file può supportare qualsiasi proprietà personalizzata definita, nonché un set di proprietà definite dal sistema. Prima di creare una proprietà personalizzata, vedere Proprietà di sistema per verificare se la proprietà che si desidera supportare è già definita da una proprietà di sistema. Assicurarsi sempre di supportare le proprietà più importanti definite dal sistema.

È consigliabile usare una matrice per progettare le proprietà:

Nome della proprietà È indicizzabile? È visualizzabile? È modificabile?
property1 S Y N
Proprietà... S Y N
propertyn N N N

 

Per ognuna di queste proprietà, è necessario determinare quali attributi devono avere e quindi descriverli formalmente nei file XML Descrizione proprietà (con estensione propdesc). Gli attributi includono il tipo di dati della proprietà, l'etichetta, la stringa della Guida e altro ancora. Per le proprietà indicizzabili, è consigliabile prestare particolare attenzione agli attributi di proprietà seguenti trovati nell'elemento XML searchInfo del file Property Description.

Attributo Descrizione
inInvertedIndex Facoltativo. Indica se un valore della proprietà stringa deve essere suddiviso in parole e ogni parola archiviata nell'indice invertito. L'indice invertito consente una ricerca efficiente di parole e frasi sul valore della proprietà usando CONTAINS o FR edizione Enterprise TEXT (ad esempio, edizione Standard LECT ... WHERE CONTAINS "sometext"). Se impostato su FAL edizione Standard, le ricerche vengono eseguite sull'intera stringa. La maggior parte delle proprietà stringa deve avere questo valore impostato su TRUE. Le proprietà non stringa devono avere questa proprietà impostata su FAL edizione Standard. Il valore predefinito è FAL edizione Standard.
isColumn Facoltativo. Indica se la proprietà deve essere archiviata nel database di Windows Search come colonna. L'archiviazione della proprietà come colonna consente il recupero, l'ordinamento, il raggruppamento e il filtro , ovvero utilizzando qualsiasi predicato, ad eccezione di CONTAINS o FR edizione Enterprise TEXT, sull'intero valore della colonna. Le proprietà visualizzate all'utente devono avere questa proprietà impostata su TRUE , a meno che non si tratti di una proprietà testuale molto grande ,ad esempio il corpo di un documento, che verrebbe eseguita la ricerca nell'indice invertito. Il valore predefinito è FAL edizione Standard.
isColumnSparse Facoltativo. Indica se una proprietà non richiede spazio se il valore è NULL. Una proprietà non di tipo sparse occupa spazio per ogni elemento, anche se il valore è NULL. Se la proprietà è multivalore, questo attributo è sempre TRUE. Questo attributo deve essere FAL edizione Standard solo se è presente un valore per ogni elemento. Il valore predefinito è TRUE.
columnIndexType Facoltativo. Per ottimizzare l'esecuzione di query, il motore di Ricerca di Windows può creare indici secondari per le proprietà con isColumn=TRUE. Ciò richiede più elaborazione e spazio su disco durante l'indicizzazione, ma migliora le prestazioni durante l'esecuzione di query. Se la proprietà tende a essere ordinata, raggruppata o filtrata (ovvero utilizzando =, !=, <, >, LIKE, MATCHES) frequentemente dagli utenti, questo attributo deve essere impostato su "OnDisk". Il valore predefinito è "NotIndexed". I valori seguenti sono validi:
  • NotIndexed: non viene creato alcun indice secondario.
  • OnDisk: creare e archiviare un indice secondario su disco.
Maxsize Facoltativo. Indica le dimensioni massime consentite per il valore della proprietà archiviato nel database di Ricerca di Windows. Questo limite si applica agli elementi indviduali di un vettore, non al vettore nel suo complesso. I valori superiori a questa dimensione vengono troncati. Il valore predefinito è "128" (byte).
Attualmente, Windows Search non usa maxSize per calcolare la quantità di dati accettata da un file. Al contrario, il limite usato da Windows Search è il prodotto delle dimensioni del file e maxGrowFactor (dimensioni file N * MaxGrowFactor) letto dal Registro di sistema in HKEY_LOCAL_MACHINE->Software->Microsoft->Windows Search->Gathering Manager->MaxGrowFactor. Il valore predefinito di MaxGrowFactor è quattro (4). Di conseguenza, se il tipo di file tende a essere ridotto in dimensioni totali, ma hanno proprietà più grandi, Windows Search potrebbe non accettare tutti i dati delle proprietà che si desidera generare. Tuttavia, è possibile aumentare MaxGrowFactor in base alle proprie esigenze.

 

Nota

Per l'attributo columnIndexType, il vantaggio delle query più veloci deve essere ponderato rispetto al tempo di indicizzazione e ai costi di spazio maggiori che gli indici secondari possono comportare. Tuttavia, questo costo viene pagato solo per gli elementi con un valore non Null , quindi per la maggior parte delle proprietà può essere impostato su "OnDisk".

 

Supporto full-text

In generale, la ricerca full-text è supportata dai componenti chiamati filtri. Tuttavia, per i tipi di file basati su testo con formati di file non replicati, i gestori di proprietà possono fornire questa funzionalità con meno attività di sviluppo. È consigliabile esaminare la sezione Contenuto full-text per un confronto tra le funzionalità del gestore di filtri e proprietà per decidere qual è la soluzione migliore per il tipo di file. Di particolare importanza è il fatto che i filtri possono gestire più identificatori di codice di lingua (LCID) per file, mentre i gestori di proprietà non possono.

Nota

Poiché i gestori di proprietà non possono suddividere il contenuto nel modo in cui i filtri possono, i file di grandi dimensioni (anche se sono formati di file non replicati) devono essere caricati completamente in memoria.

 

Considerazioni sull'implementazione del sistema operativo

Informazioni sull'implementazione per Windows 7

In Windows 7 e versioni successive è disponibile un nuovo comportamento durante la registrazione di un gestore di proprietà, IFilter o una nuova estensione. Quando viene installato un nuovo gestore di proprietà e/o IFilter , i file con le estensioni corrispondenti vengono reindicizzare automaticamente.

In Windows 7 è consigliabile installare un IFilter in combinazione con i gestori delle proprietà corrispondenti e che IFilter viene registrato prima del gestore della proprietà. La registrazione del gestore delle proprietà avvia la reindicizzazione immediata dei file indicizzati in precedenza senza prima richiedere un riavvio e sfrutta i filtri IFilter registrati in precedenza allo scopo dell'indicizzazione del contenuto.

Se viene installato solo un IFilter , senza un gestore di proprietà corrispondente, la reindicizzazione automatica viene eseguita dopo un riavvio del servizio di indicizzazione o dopo un riavvio del sistema.

Per i flag di descrizione delle proprietà specifici di Windows 7, vedi gli argomenti di riferimento seguenti:

Informazioni sull'implementazione per Windows Vista e versioni precedenti

Prima di Windows Vista, i filtri forniva il supporto per l'analisi e l'enumerazione del contenuto e delle proprietà dei file. Con l'introduzione del sistema di proprietà, i gestori delle proprietà gestiscono le proprietà dei file mentre i filtri gestiscono il contenuto del file. Per Windows Vista, è necessario sviluppare solo un'implementazione parziale dell'interfaccia IFilterin coordinamento con un gestore di proprietà, come descritto in Procedure consigliate per la creazione di gestori di filtri in Windows Search.

Anche se il sistema di proprietà è incluso anche nell'installazione di Windows Search per Windows XP, le applicazioni di terze parti e legacy possono richiedere che i filtri gestiscono sia il contenuto che le proprietà. Pertanto, se si sviluppa nella piattaforma Windows XP, è necessario fornire un'implementazione completa del filtro, nonché un gestore di proprietà per il tipo di file o la proprietà personalizzata.

 

Scrittura di file di descrizione delle proprietà

La struttura dei file XML di descrizione della proprietà (con estensione propdesc) è descritta nell'argomento propertyDescription . Di particolare interesse per la ricerca sono gli attributi dell'elemento searchInfo . Dopo aver deciso quali proprietà supportare, è necessario creare e registrare i file di descrizione delle proprietà per ogni proprietà. Quando si registrano i file con estensione propdesc, questi vengono inclusi nell'elenco delle descrizioni delle proprietà dello schema e diventano nomi di colonna all'interno dell'archivio delle proprietà del motore di ricerca.

È possibile registrare le descrizioni delle proprietà personalizzate usando la funzione PSRegisterPropertySchema , un'API wrapper che chiama il sottosistema dello schema IPropertySystem::RegisterPropertySchema. Questa funzione informa il sottosistema dello schema dello schema di proprietà (con estensione propdesc) di aggiunta di file con estensione propdesc, usando i percorsi dei file con estensione propdesc nel computer locale, in genere la directory di installazione dell'applicazione in "Programmi". In genere, un programma di installazione o un'applicazione (ad esempio, il programma di installazione del gestore di proprietà) chiamerà questo metodo dopo l'installazione dei file con estensione propdesc.

 

Implementazione di gestori di proprietà

Lo sviluppo di un gestore di proprietà comporta l'implementazione delle interfacce seguenti:

  • IInitialzeWithStream: fornisce l'inizializzazione basata su flusso del gestore di proprietà.
  • IPropertyStore: enumera, ottiene e imposta i valori delle proprietà.
  • IPropertyStoreCapabilities: facoltativo. Identifica se gli utenti possono modificare una proprietà da un'interfaccia utente.

IInitializeWithStream

Come descritto nell'argomento Sistema di proprietà, è consigliabile implementare gestori di proprietà con IInitializeWithStream per eseguire l'inizializzazione basata su flusso. Se si sceglie di non implementare IInitializeWithStream, il gestore di proprietà deve rifiutare esplicitamente l'esecuzione nel processo di isolamento impostando il flag DisableProcessIsolation sulla chiave del Registro di sistema del gestore proprietà. La disabilitazione dell'isolamento del processo è in genere destinata solo ai gestori di proprietà legacy e deve essere evitata in modo strenuo da qualsiasi nuovo codice.

Ipropertystore

Per creare un gestore di proprietà, è necessario implementare l'interfaccia IPropertyStore con i metodi seguenti.

metodo Descrizione
Commit Salva una modifica della proprietà nel file.
GetAt Recupera una chiave di proprietà dalla matrice di proprietà di un elemento.
GetCount Ottiene il numero di proprietà associate al file.
GetValue Recupera i dati per una proprietà specifica.
SetValue Imposta un nuovo valore della proprietà o sostituisce o rimuove un valore esistente.

 

 

 

Considerazioni importanti per l'implementazione di questa interfaccia sono incluse nella documentazione di IPropertyStore.

Nota

Se il gestore delle proprietà genera più valori per la stessa proprietà per un determinato elemento, solo l'ultimo valore generato viene archiviato nel catalogo.

 

 

IPropertyStoreCapabilities

I gestori delle proprietà possono facoltativamente implementare questa interfaccia per disabilitare la capacità di un utente di modificare proprietà specifiche. Queste proprietà sono in genere modificabili nella pagina Dettagli e nel riquadro, ma non è consentito modificarle nel gestore delle proprietà di implementazione. L'implementazione di questa interfaccia offre un'esperienza utente migliore rispetto all'alternativa, ovvero un semplice errore di run-time dalla shell.

 

Verifica dell'indicizzazione degli elementi

Dopo aver implementato il gestore delle proprietà, assicurarsi che gli elementi registrati dal gestore vengano indicizzati. È possibile usare Gestione cataloghi per avviare nuovamente l'indicizzazione ed è anche possibile usare Gestione ambito ricerca per indicizzazione per configurare le regole predefinite che indicano gli URL per cui si vuole che l'indicizzatore eselabori la ricerca per indicizzazione. Un'altra opzione consiste nel seguire l'esempio di codice ReIndex negli esempi di codice di Windows Search.

Per altre informazioni, vedere Uso di Gestione cataloghi e Utilizzo di Gestione ambito ricerca per indicizzazione.

 

Installazione e registrazione dei gestori di proprietà

Con il gestore di proprietà implementato, deve essere registrato e l'estensione del nome file associata al gestore. L'esempio seguente mostra le chiavi e i valori del Registro di sistema necessari per eseguire questa operazione.

HKEY_CLASSES_ROOT
   CLSID
      {<CLSID for property handler>}
         (Default) = <Property Handler Name>
         InProcServer32
            (Default) = <full path to property handler dll>
            ThreadingModel = <your threading model>
HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               PropertySystem
                  PropertyHandlers
                     <.fileextention>
                        (Default) = {<CLSID for property handler>}

 

Test e risoluzione dei problemi dei gestori di proprietà

L'elenco seguente fornisce consigli sui tipi di test da eseguire:

  • Testare il recupero dell'output da ogni singola proprietà supportata dal tipo di file.
  • Usare valori di proprietà grandi, ad esempio, usare un metatag di grandi dimensioni nei documenti HTML.
  • Verificare che il gestore delle proprietà non esemplifichi gli handle di file modificandolo dopo aver ottenuto l'output dal gestore proprietà oppure usando uno strumento come oh.exe prima e dopo l'enumerazione delle proprietà del file.
  • Testare tutti i tipi di file associati al gestore di proprietà. Ad esempio, verificare che il filtro HTML funzioni con i tipi di file .htm e .html.
  • Eseguire il test con file danneggiati. Il gestore delle proprietà deve avere esito negativo correttamente.
  • Se un'applicazione supporta la crittografia, verificare che il gestore della proprietà non restituisca testo crittografato.
  • Se il gestore delle proprietà supporta la ricerca full-text:
    • Usare più caratteri Unicode speciali nel contenuto del file e testarne l'output.
    • Testare la gestione di documenti di grandi dimensioni per assicurarsi che il gestore delle proprietà funzioni come previsto.

Test di installazione e installazione

Infine, è necessario testare le routine di installazione e disinstallazione.

  • L'installazione deve essere ripristinata da installazioni non riuscite( ad esempio, dall'annullamento e quindi dal riavvio dell'installazione).
  • La disinstallazione deve eliminare tutti i file associati al gestore di proprietà.
  • La disinstallazione non deve eliminare file diversi da quelli associati all'installazione del gestore delle proprietà.
  • Le chiavi del Registro di sistema associate al gestore delle proprietà devono essere rimosse durante la disinstallazione.
  • La disinstallazione deve funzionare anche se i file vengono eliminati dalla directory di installazione.

Risoluzione dei problemi relativi ai gestori di proprietà

Di seguito sono riportati alcuni errori comuni eseguiti durante lo sviluppo di gestori di proprietà:

  • Installazione di file con estensione propdesc o DLL in una directory utente.
  • Registrazione dei componenti tramite percorsi relativi.
  • Registrazione dei componenti in HKEY_CURRENT_Uedizione Standard R invece di HKEY_LOCAL_MACHINE.
  • Dimenticando di impostare DisableProcessIsolation per i gestori non di flusso.
  • Inserimento del file di test in un percorso non indicizzato.

Se si verificano problemi durante l'uso del gestore delle proprietà con l'indicizzatore, ecco alcuni suggerimenti utili per risolvere i problemi:

  • Verificare che le descrizioni delle proprietà (file con estensione propdesc) siano contrassegnate come isColumn="true", isViewable="true" e isQueryable="true" in base alle esigenze.
  • Verificare che i file con estensione propdesc si trovino in un percorso globale.
  • Verificare di aver registrato i file con estensione propdesc usando percorsi assoluti.
  • Verificare che il registro eventi non abbia registrato errori durante la registrazione del file con estensione propdesc.
  • Verificare che le DLL si trovano in una posizione globale (e non nel profilo utente).
  • Verificare che le DLL siano registrate in HKEY_LOCAL_MACHINE\Software\Classes.
  • Verificare che le DLL siano registrate usando percorsi completi (o stringhe REG_EXPAND_SZ che si espandono in percorsi assoluti usando variabili di ambiente note dall'account di sistema).
  • Verificare che il gestore delle proprietà funzioni in Esplora risorse.
  • Sebbene sia consigliabile usare IInitializeWithStream, se è necessario usare IInitializeWithFile o IInitializeWithItem, verificare di specificare DisableProcessIsolation.
  • Verificare che le opzioni di indicizzazione Pannello di controllo elenchino il tipo di file come tipo di file indicizzato.
  • Verificare che il file di test si trova in un percorso indicizzato.
  • Verificare che il file di test sia stato modificato dopo aver installato il gestore delle proprietà.

Se il file di test si trova in un percorso indicizzato e l'indicizzatore ha già eseguito la ricerca per indicizzazione in tale percorso, è necessario modificare il file in qualche modo per attivare una reindicizzazione del file.

 

Uso dei gestori di proprietà forniti dal sistema

Windows include diversi gestori di proprietà forniti dal sistema che è possibile usare se il formato del tipo di file è compatibile. Se si definisce una nuova estensione di file che usa uno di questi formati, è possibile usare i gestori forniti dal sistema registrando l'identificatore di classe del gestore (CLSID) per l'estensione di file.

È possibile usare CLSID elencato nella tabella seguente per registrare i gestori delle proprietà forniti dal sistema per il tipo di formato di file.

Formatta CLSID
OLE DocFile {8d80504a-0826-40c5-97e1-ebc68f953792}
Salvare il file XML del gioco {ECDD6472-2B9B-4b4b-AE36-F316DF3C8D60}
Gestore XPS/OPC {45670FA8-ED97-4F44-BC93-305082590BFB}
XML {c73f6f30-97a0-4ad1-a08f-540d4e9bc7b9}

 

Prima di creare una proprietà personalizzata, è necessario assicurarsi che non esista una proprietà definita dal sistema che è possibile usare. È possibile enumerare le proprietà definite dal sistema chiamando P edizione Standard numeratePropertyDescriptions o usando lo strumento da riga di comando prop.exe.

Lo schema di sistema definisce il modo in cui queste proprietà interagiscono con l'indicizzatore e non è possibile modificarle. Inoltre, l'applicazione usata per creare, modificare e salvare il tipo di file deve essere conforme anche a determinati comportamenti. Ad esempio, se l'applicazione implementa il salvataggio sicuro (in cui viene creato un file temporaneo durante la modifica e quindi ReplaceFile() viene usato per scambiare la nuova versione per la versione precedente, deve trasferire tutte le proprietà dal file originale al nuovo file. In caso contrario, il file perde le proprietà aggiunte da utenti o altre applicazioni.

 

Esempio

Di seguito viene illustrata la registrazione del gestore OLE DocFile fornito dal sistema per un tipo di file con un oggetto . Estensione OLEDocFile.

HKEY_CLASSES_ROOT
   SystemFileAssociations
      .OLEDocFile
         shellex
            {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
               (Default) = {9DBD2C50-62AD-11d0-B806-00C04FD706EC}

Di seguito viene illustrata la registrazione delle informazioni sull'elenco delle proprietà in modo che le proprietà di . I file OLEDocFile vengono visualizzati nella scheda Dettagli e nel riquadro.

HKEY_CLASSES_ROOT
   SystemFileAssociations
      .OLEDocFile
         ExtendedTileInfo = prop:System.ItemType;System.Size;System.DateModified;System.Author;System.OfflineAvailability
         FullDetails = prop:System.PropGroup.Description;System.Title;System.Subject;
System.Keywords;System.Category;System.Comment;System.PropGroup.Origin;
System.Author;System.Document.LastAuthor;System.Document.RevisionNumber;
System.Document.Version;System.ApplicationName;System.Company;System.Document.Manager;
System.Document.DateCreated;System.Document.DateSaved;System.Document.DatePrinted;
System.Document.TotalEditingTime;System.PropGroup.Content;System.ContentStatus;
System.ContentType;System.Document.PageCount;System.Document.WordCount;
System.Document.CharacterCount;System.Document.LineCount;
System.Document.ParagraphCount;System.Document.Template;System.Document.Scale;
System.Document.LinksDirty;System.Language;System.PropGroup.FileSystem;
System.ItemNameDisplay;System.ItemType;System.ItemFolderPathDisplay;
System.DateCreated;System.DateModified;System.Size;System.FileAttributes;
System.OfflineAvailability;System.OfflineStatus;System.SharedWith;
System.FileOwner;System.ComputerName
         InfoTip = prop:System.ItemType;System.Size;System.DateModified;System.Document.PageCoun
         PerceivedType = document
         PreviewDetails = prop:*System.DateModified;System.Author;System.Keywords;
*System.Size;System.Title;System.Comment;System.Category;
*System.Document.PageCount;System.ContentStatus;System.ContentType;
*System.OfflineAvailability;*System.OfflineStatus;System.Subject;
*System.DateCreated;*System.SharedWith

 

Riferimento

Mapping delle proprietà

Concettuale

Procedure consigliate per la creazione di gestori di filtri in Windows Search

Processo di indicizzazione

Sviluppo di gestori di protocolli

Proprietà definite dal sistema per i formati di file personalizzati

Altre risorse

Sistema di proprietà

proprietà di sistema

Esempi di codice di Windows Search