Indizieren von Priorisierungs- und Rowsetereignissen in Windows 7

In diesem Thema wird die Einführung der Indizierungspriorisierung und Rowsetereignisse für Windows 7 beschrieben.

Dieses Thema ist wie folgt organisiert:

Indizierungspriorisierung und Rowsetereignisse

In Windows 7? und höher gibt es einen Prioritätsstapel, in dem der Kontext einer bestimmten Abfrage vom Client anfordern kann, dass die in dieser Abfrage verwendeten Bereiche über dem von normalen Elementen priorisiert werden.

Dieser Priorisierungsstapel weist die folgenden Merkmale auf:

  • Elemente im Stapel können vordergrund-, hoch- oder low-Priorität haben:
    • Vordergrund: Die Backofflogik wird übersprungen, und die Indizierung erfolgt so schnell, wie es der Computer zulässt.
    • Hoch: Priorisierung wurde mit Backoff angefordert.
    • Niedrig: Priorisierung wurde angefordert, nicht auf Kosten anderer Bereiche auf dem Stapel, sondern über der nicht priorisierten Indizierung.
  • Jede Anforderung für hohe oder Vordergrundpriorität stößt die anfordernde Abfrage automatisch an den Anfang des Stapels.
  • Nur das Element oben auf dem Stapel kann Vordergrundpriorität haben.
  • Eine Abfrage mit Priorität im Vordergrund, die in der Priorität heruntergefahren wird, erhält ein Ereignis, das sie darüber informiert, dass sie die Vordergrundpriorität verloren hat und mit backoff zu einer hohen Priorität geworden ist.

Der Prioritätsstapel legt wie folgt eine Gesamtpriorität von Elementen fest, die im Indexer verarbeitet werden:

  • Benachrichtigungen mit hoher Priorität haben kein Backoff und werden in der Regel nur für eine kleine Anzahl von Elementen gesendet. Windows Explorer verwendet diese Priorität beispielsweise für Vorgänge mit kleinen Kopiermodulen.

  • Priority Stack steht ganz oben im Stapel, verfügt über backoff und ist die zuletzt angeforderte Prioritätsabfrage.

  • Zweite Abfrage im Stapel.

  • Dritte Abfrage im Stapel.

  • Vierte Abfrage im Stapel usw.

  • Elemente mit normaler Priorität.

  • Gelöschte Elemente.

    Hinweis

    Elemente innerhalb jeder Gruppe werden intern über die ältere Elementsemantik priorisiert.

     

Beispiele für IRowsetPriorization

Die primäre API für Priorisierungsarbeiten ist über die folgende Schnittstelle verfügbar, die durch Abfragen des zurückgegebenen Rowsets aufgerufen werden kann:

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 );
};

Die Rowsetpriorisierung funktioniert wie folgt:

  1. IRowsetPrioritization wird mit der IUnknown::QueryInterface-Methode für ein Indexerrowset abgerufen. DBPROP_ENABLEROWSETEVENTS muss mit der OLE DB-Methode ICommandProperties::SetProperties vor dem Ausführen der Abfrage auf TRUE festgelegt werden, um die Rowsetpriorisierung zu verwenden.
  2. IRowsetPrioritization::SetScopePriority legt die Priorisierung für die Bereiche fest, die zur Abfrage gehören, und das Intervall, in dem das Bereichsstatistikereignis ausgelöst wird, wenn ausstehende Dokumente in den Abfragebereichen indiziert werden sollen. Dieses Ereignis wird ausgelöst, wenn die Prioritätsebene auf den Standardwert festgelegt ist.
  3. IRowsetPrioritization::GetScopeStatistics kann verwendet werden, um die Anzahl der indizierten Elemente im Bereich, die Anzahl der ausstehenden Dokumente, die dem Bereich hinzugefügt werden sollen, und die Anzahl der Dokumente abzurufen, die innerhalb dieses Bereichs neu indiziert werden müssen.

IRowsetPrioritization-Ereignisse

Es gibt drei Rowsetereignisse in IRowsetEvents::OnRowsetEvent in der ROWSETEVENT_TYPE Enumeration:

    // 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 );

Die Rowsetereignisse sind wie folgt:

  • Das ROWSETEVENT_TYPE_DATAEXPIRED-Ereignis gibt an, dass daten, die das Rowset sichern, abgelaufen sind und dass ein neues Rowset angefordert werden sollte.
  • Das ROWSET_TYPE_FOREGROUNDLOST-Ereignis gibt an, dass ein Element, das im Priorisierungsstapel die Vordergrundpriorität hatte, herabgestuft wurde, da sich eine andere Person vor dieser Abfrage priorisiert hat.
  • Das ROWSETEVENT_TYPE_SCOPESTATISTICS-Ereignis gibt Ihnen dieselben Informationen, die aus dem Aufruf der IRowsetPrioritization::GetScopeStatistics-Methode verfügbar sind, aber über einen Pushmechaniker wie folgt:
    • Das Ereignis tritt auf, wenn die Priorisierungs-API verwendet wurde, um eine nicht standardmäßige Priorisierungsebene und eine Statistikereignishäufigkeit ungleich 0 anzufordern.
    • Das Ereignis tritt nur auf, wenn sich statistiken tatsächlich ändern und das in der IRowsetPrioritization angegebene Intervall abgelaufen ist (das Intervall garantiert nicht die Häufigkeit des Ereignisses).
    • Dieses Ereignis löst garantiert den Zustand "Bounce Zero" aus (null elemente, die noch hinzugefügt werden müssen, null ändert sich bleiben), vorausgesetzt, dass ein Ungleich null-Ereignis ausgelöst wurde.
    • Der Indexer kann Elemente verarbeiten, ohne dieses Ereignis zu senden, wenn sich die Warteschlange vor der Statistikereignishäufigkeit leert.

Zusätzliche Ressourcen

Sehen Sie sich die folgenden Ressourcen im Zusammenhang mit Priorisierung und Rowsets an:

Windows 7 Search

Neu für Windows 7 Search

Windows Shell-Bibliotheken in Windows 7