Condividi tramite


Indicizzazione della prioritizzazione e degli eventi dei set di righe in Windows 7

Questo argomento illustra l'introduzione della prioritizzazione dell'indicizzazione e degli eventi del set di righe per Windows 7.

Questo argomento è organizzato come segue:

Prioritizzazione dell'indicizzazione ed eventi del set di righe

In Windows 7 e versioni successive, è presente uno stack di priorità in cui, nel contesto di una determinata query, il client può richiedere che gli ambiti utilizzati in tale query siano classificati con una priorità superiore rispetto agli elementi normali.

Questo stack di priorità presenta le caratteristiche seguenti:

  • Gli elementi nello stack possono avere priorità in primo piano, alto o basso:
    • in primo piano: la logica di backoff viene ignorata e l'indicizzazione procede alla massima velocità consentita dal computer.
    • alta priorità: è stata richiesta la definizione delle priorità con ritiro.
    • Low: è stata richiesta la definizione di priorità, non a scapito di altre aree nello stack, ma al di sopra delle indicizzazioni non prioritarie.
  • Qualsiasi richiesta di priorità alta o in primo piano aumenta automaticamente la query richiedente all'inizio dello stack.
  • Solo l'elemento all'inizio dello stack può avere priorità in primo piano.
  • Una query con priorità di primo piano che viene abbassata di priorità riceve un evento che la informa di aver perso la priorità di primo piano e di essere diventata una priorità alta con riduzione.

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

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

  • Lo Stack di Priorità è in cima allo stack, ha backoff ed è l'ultima query a priorità richiesta.

  • Seconda interrogazione nella pila.

  • Terza query nello stack.

  • Quarta query nello stack, e via dicendo.

  • 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 di priorità dei set di righe funziona come segue:

  1. IRowsetPrioritization viene acquisito con metodo IUnknown::QueryInterface in 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 usare la definizione di 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 ci sono documenti in sospeso da indicizzare all'interno degli ambiti di 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 reindicizzare all'interno di questo ambito.

Eventi IRowsetPrioritization

Nell'enumerazione ROWSETEVENT_TYPE, ci sono tre eventi di rowset in IRowsetEvents::OnRowsetEvent:

    // 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 che aveva la priorità alta nello stack di priorità è stato declassato, perché un altro utente si è posizionato davanti a questa query.
  • L'evento ROWSETEVENT_TYPE_SCOPESTATISTICS fornisce le stesse informazioni disponibili nella 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 definizione delle priorità non predefinito e una frequenza di evento di statistiche non zero.
    • L'evento si verifica solo quando le statistiche cambiano effettivamente e l'intervallo specificato nella IRowsetPrioritization è trascorso (l'intervallo non garantisce la frequenza dell'evento).
    • Questo evento viene garantito di 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 si svuota prima della frequenza con cui si verificano gli eventi delle statistiche.

Risorse aggiuntive

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

Ricerca di Windows 7

Novità per Windows 7 Search

Librerie della Shell di Windows in Windows 7