Condividi tramite


Indicizzazione di eventi di definizione delle priorità e set di righe in Windows 7

In questo argomento viene illustrata l'introduzione dell'indicizzazione degli eventi di definizione delle priorità e dei set di righe per Windows 7.

Questo argomento è organizzato come segue:

Indicizzazione di eventi di definizione delle priorità e set di righe

In Windows 7?e versioni successive è presente uno stack di priorità all'interno del quale il contesto di una determinata query, il client può richiedere che gli ambiti usati nella query vengano classificati in ordine di priorità sopra a quello degli elementi normali.

Questo stack di priorità presenta le caratteristiche seguenti:

  • Gli elementi nello stack possono avere priorità in primo piano, alto o basso:
    • Primo piano: la logica backoff viene ignorata e l'indicizzazione procede con la stessa velocità consentita dal computer.
    • Alta: la definizione delle priorità è stata richiesta con il backoff.
    • Bassa: è stata richiesta la definizione delle priorità, non a scapito di altri ambiti nello stack, ma sopra l'indicizzazione non prioritaria.
  • Qualsiasi richiesta di priorità in primo piano o elevata aumenta automaticamente la query richiedente all'inizio dello stack.
  • Solo l'elemento nella parte superiore dello stack può avere la priorità in primo piano.
  • Una query con priorità in primo piano che viene abbassata nella priorità riceve un evento che informa che ha perso la priorità in primo piano e diventa una priorità elevata con backoff.

Lo stack di priorità imposta una priorità complessiva degli elementi elaborati nell'indicizzatore come indicato di seguito:

  • Le notifiche con priorità elevata non hanno alcun backoff e vengono in genere inviate solo per un numero ridotto di elementi. Ad esempio, Esplora risorse usa questa priorità per le operazioni del motore di copia di piccole dimensioni.

  • Lo stack di priorità è superiore allo stack, ha backoff ed è l'ultima query con priorità richiesta.

  • Seconda query nello stack.

  • Terza query nello stack.

  • Quarta query nello stack e così via.

  • Elementi priorità normali.

  • Elementi eliminati.

    Nota

    Gli elementi all'interno di ogni gruppo vengono classificati in ordine di priorità internamente tramite la semantica precedente per elemento.

     

Esempi di IRowsetPriorization

L'API primaria per il lavoro di definizione delle priorità è disponibile tramite l'interfaccia seguente, che può essere chiamata eseguendo una query sul set di righe restituito:

typedef [v1_enum] enum
{
    PRIORITY_LEVEL_FOREGROUND           = 0,    // process items in the scope first as quickly as possible
    PRIORITY_LEVEL_HIGH                 = 1,    // process items in the scope first at the normal rate
    PRIORITY_LEVEL_LOW                  = 2,    // process items in this scope before those at the normal rate, but after any other prioritization requests
    PRIORITY_LEVEL_DEFAULT              = 3     // process items at the normal indexer rate
} PRIORITY_LEVEL;


[
    object,
    uuid(IRowsetPrioritization_GUID),
    pointer_default(unique)
]
interface IRowsetPrioritization : IUnknown
{
    // Sets or retrieves the current indexer prioritization level for the scope specified by
    // this query.

    HRESULT SetScopePriority( [in] PRIORITY_LEVEL priority, [in] DWORD scopeStatisticsEventFrequency );
    HRESULT GetScopePriority( [out] PRIORITY_LEVEL * priority, [out] DWORD * scopeStatisticsEventFrequency );

    // Gets information describing the scope specified by this query:
    // indexedDocumentCount     -   The total number of documents currently indexed in the scope
    // oustandingAddCount       -   The total number of documents yet to be indexed in the scope (those not yet included in indexedDocumentCount)
    // oustandingModifyCount    -   The total number of documents indexed in the scope that need to be re-indexed (included in indexedDocumentCount)
    
    HRESULT GetScopeStatistics( [out] DWORD * indexedDocumentCount, [out] DWORD * oustandingAddCount, [out] DWORD * oustandingModifyCount );
};

La definizione delle priorità dei set di righe funziona come segue:

  1. IRowsetPrioritization viene acquisito con il metodo IUnknown::QueryInterface su un set di righe dell'indicizzatore. DBPROP_ENABLEROWSETEVENTS deve essere impostato su TRUE con il metodo OLE DB ICommandProperties::SetProperties prima di eseguire la query per utilizzare la definizione delle priorità del set di righe.
  2. IRowsetPrioritization::SetScopePriority imposta la priorità per gli ambiti appartenenti alla query e l'intervallo in cui viene generato l'evento delle statistiche di ambito quando sono presenti documenti in sospeso da indicizzare negli ambiti della query. Questo evento viene generato se il livello di priorità è impostato su predefinito.
  3. IRowsetPrioritization::GetScopeStatistics può essere usato per ottenere il numero di elementi indicizzati nell'ambito, il numero di documenti in sospeso da aggiungere nell'ambito e il numero di documenti che devono essere ri indicizzati all'interno di questo ambito.

Eventi di IRowsetPrioritization

Esistono tre eventi del set di righe in IRowsetEvents::OnRowsetEventnell'enumerazione ROWSETEVENT_TYPE :

    // This method allows for future notifications of various actions about your rowset or items within
    // eventType:                               - An identifier of the particular event being sent
    // pVarEventData:                           - The expected value of the EventData for each event type
    //      ROWSETEVENT_TYPE_DATAEXPIRED        - VT_EMPTY
    //      ROWSETEVENT_TYPE_FOREGROUNDLOST     - VT_EMPTY
    //      ROWSETEVENT_TYPE_SCOPESTATISTICS    - VT_VECTOR | VT_UI4 - 3 elements (0 = indexed items, 1 = outstanding adds, 2 = oustanding modifies)

    HRESULT OnRowsetEvent( [in] ROWSETEVENT_TYPE eventType, [in] REFPROPVARIANT eventData );

Gli eventi del set di righe sono i seguenti:

  • L'evento ROWSETEVENT_TYPE_DATAEXPIRED indica che i dati di backup del set di righe sono scaduti e che deve essere richiesto un nuovo set di righe.
  • L'evento ROWSET_TYPE_FOREGROUNDLOST indica che un elemento con priorità in primo piano nello stack di priorità è stato abbassato di livello, perché un altro utente ha priorità prima di questa query.
  • L'evento ROWSETEVENT_TYPE_SCOPESTATISTICS fornisce le stesse informazioni disponibili dalla chiamata al metodo IRowsetPrioritization::GetScopeStatistics, ma tramite un meccanico push, come indicato di seguito:
    • L'evento si verifica se l'API di definizione delle priorità è stata usata per richiedere un livello di priorità non predefinito e una frequenza di evento delle statistiche non zero.
    • L'evento si verifica solo quando le statistiche cambiano effettivamente e l'intervallo specificato in IRowsetPrioritization è trascorso (l'intervallo non garantisce la frequenza dell'evento).
    • Questo evento è garantito per generare uno stato di "rimbalzo zero" (zero elementi rimanenti da aggiungere, zero modifiche rimanenti), purché sia stato generato un evento diverso da zero.
    • L'indicizzatore può elaborare gli elementi senza inviare questo evento, se la coda svuota prima della frequenza degli eventi delle statistiche.

Risorse aggiuntive

Vedere le risorse seguenti correlate alla definizione delle priorità e ai set di righe:

Ricerca in Windows 7

Novità per Windows 7 Search

Librerie della shell di Windows in Windows 7