Indexación de priorización y eventos de conjunto de filas en Windows 7

En este tema se describe la introducción de la priorización de indexación y los eventos de conjunto de filas para Windows 7.

Este tema se organiza de la siguiente manera:

Indexación de priorización y eventos de conjunto de filas

En Windows 7?y versiones posteriores, hay una pila de prioridades en la que el contexto de cualquier consulta determinada, el cliente puede solicitar que los ámbitos usados en esa consulta se prioricen por encima de los elementos normales.

Esta pila de priorización tiene las siguientes características:

  • Los elementos de la pila pueden tener prioridad en primer plano, alta o baja:
    • Primer plano: la lógica de retroceso se omite y la indexación continúa tan rápido como permite la máquina.
    • Alta: se ha solicitado priorización con retroceso.
    • Bajo: se ha solicitado la priorización, no a costa de otros ámbitos de la pila, pero por encima de la indexación no prioritaria.
  • Cualquier solicitud de prioridad alta o en primer plano aumenta automáticamente la consulta que realiza la solicitud en la parte superior de la pila.
  • Solo el elemento de la parte superior de la pila puede tener prioridad en primer plano.
  • Una consulta con prioridad de primer plano que se reduce en prioridad recibe un evento que le notifica que ha perdido la prioridad de primer plano y se ha convertido en una prioridad alta con retroceso.

La pila de prioridad establece una prioridad general de los elementos que se procesan en el indexador de la siguiente manera:

  • Las notificaciones de prioridad alta no tienen retroceso y normalmente solo se envían para un pequeño número de elementos. Por ejemplo, el Explorador de Windows usa esta prioridad para las operaciones pequeñas del motor de copia.

  • Priority Stack es la parte superior de la pila, tiene retroceso y es la última consulta de prioridad solicitada.

  • Segunda consulta en la pila.

  • Tercera consulta de la pila.

  • Cuarta consulta en la pila, etc.

  • Elementos de prioridad normales.

  • Elementos eliminados.

    Nota

    Los elementos de cada grupo se priorizan internamente a través de la semántica anterior por elemento.

     

Ejemplos de IRowsetPriorization

La API principal para el trabajo de priorización está disponible a través de la siguiente interfaz, a la que se puede llamar consultando el conjunto de filas devuelto:

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 priorización de conjuntos de filas funciona de la siguiente manera:

  1. IRowsetPrioritization se adquiere con el método IUnknown::QueryInterface en un conjunto de filas del indexador. DBPROP_ENABLEROWSETEVENTS debe establecerse en TRUE con el método ICommandProperties::SetProperties de OLE DB antes de ejecutar la consulta para usar la priorización de conjuntos de filas.
  2. IRowsetPrioritization::SetScopePriority establece la priorización de los ámbitos que pertenecen a la consulta y el intervalo en el que se genera el evento de estadísticas de ámbito cuando hay documentos pendientes que se van a indexar dentro de los ámbitos de consulta. Este evento se genera si el nivel de prioridad está establecido en predeterminado.
  3. IRowsetPrioritization::GetScopeStatistics se puede usar para obtener el número de elementos indexados en el ámbito, el número de documentos pendientes que se van a agregar en el ámbito y el número de documentos que deben volver a indexarse dentro de este ámbito.

Eventos de IRowsetPrioritization

Hay tres eventos de conjunto de filas en IRowsetEvents::OnRowsetEvent en la enumeración 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 );

Los eventos del conjunto de filas son los siguientes:

  • El evento ROWSETEVENT_TYPE_DATAEXPIRED indica que los datos que respaldan el conjunto de filas han expirado y que se debe solicitar un nuevo conjunto de filas.
  • El evento ROWSET_TYPE_FOREGROUNDLOST indica que se ha degradado un elemento que tenía prioridad en primer plano en la pila de priorización, porque otra persona se priorizó por delante de esta consulta.
  • El evento ROWSETEVENT_TYPE_SCOPESTATISTICS proporciona la misma información disponible en la llamada al método IRowsetPrioritization::GetScopeStatistics , pero a través de un mecánico de inserción, como se indica a continuación:
    • El evento surge si la API de priorización se ha usado para solicitar un nivel de priorización no predeterminado y una frecuencia de evento de estadísticas no cero.
    • El evento solo surge cuando las estadísticas cambian realmente y el intervalo especificado en la IRowsetPrioritization ha transcurrido (el intervalo no garantiza la frecuencia del evento).
    • Se garantiza que este evento genere un estado "bounce zero" (cero elementos restantes que se van a agregar, cero modificados restantes), siempre que se haya generado un evento distinto de cero.
    • El indexador puede procesar elementos sin enviar este evento, si la cola vacía antes de la frecuencia del evento de estadísticas.

Recursos adicionales

Consulte los siguientes recursos relacionados con la priorización y los conjuntos de filas:

Windows 7 Search

Novedades de La búsqueda de Windows 7

Bibliotecas de Shell de Windows en Windows 7