Compartilhar via


Indexando eventos de priorização e conjunto de linhas no Windows 7

Este tópico descreve a introdução da priorização de indexação e eventos de conjunto de linhas para o Windows 7.

Este tópico é organizado da seguinte maneira:

Indexando eventos de priorização e conjunto de linhas

No Windows 7?e posteriores, há uma pilha de prioridades na qual o contexto de qualquer consulta específica, o cliente pode solicitar que os escopos usados nessa consulta sejam priorizados acima do de itens normais.

Essa pilha de priorização tem as seguintes características:

  • Os itens na pilha podem ter primeiro plano, alta ou baixa prioridade:
    • Primeiro plano: a lógica de backoff é ignorada e a indexação prossegue tão rápido quanto o computador permite.
    • Alta: a priorização foi solicitada com retirada.
    • Baixa: a priorização foi solicitada, não às custas de outros escopos na pilha, mas acima da indexação não priorizada.
  • Qualquer solicitação de prioridade alta ou em primeiro plano aumenta a consulta de solicitação para a parte superior da pilha automaticamente.
  • Somente o item na parte superior da pilha pode ter prioridade em primeiro plano.
  • Uma consulta com prioridade em primeiro plano que é pressionada em prioridade recebe um evento notificando-a de que perdeu a prioridade de primeiro plano e se tornou uma prioridade alta com retirada.

A pilha de prioridade define uma prioridade geral dos itens que são processados no indexador da seguinte maneira:

  • As notificações de Alta Prioridade não têm retirada e normalmente são enviadas apenas para um pequeno número de itens. Por exemplo, o Windows Explorer usa essa prioridade para pequenas operações do mecanismo de cópia.

  • Priority Stack é superior à pilha, tem retirada e é a última consulta de prioridade solicitada.

  • Segunda consulta na pilha.

  • Terceira consulta na pilha.

  • Quarta consulta na pilha e assim por diante.

  • Itens de Prioridade Normal.

  • Itens excluídos.

    Observação

    Os itens dentro de cada grupo são priorizados internamente por meio da semântica por item mais antiga.

     

Exemplos de IRowsetPriorization

A API primária para o trabalho de priorização está disponível por meio da seguinte interface, que pode ser chamada consultando o conjunto de linhas retornado:

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

A priorização do conjunto de linhas funciona da seguinte maneira:

  1. IRowsetPrioritization é adquirido com o Método IUnknown::QueryInterface em um conjunto de linhas do indexador. DBPROP_ENABLEROWSETEVENTS deve ser definido como TRUE com o método OLE DB ICommandProperties::SetProperties antes de executar a consulta para usar a priorização do conjunto de linhas.
  2. IRowsetPrioritization::SetScopePriority define a priorização para os escopos pertencentes à consulta e o intervalo em que o evento de estatísticas de escopo é gerado quando há documentos pendentes a serem indexados dentro dos escopos de consulta. Esse evento será gerado se o nível de prioridade for definido como padrão.
  3. IRowsetPrioritization::GetScopeStatistics pode ser usado para obter o número de itens indexados no escopo, o número de documentos pendentes a serem adicionados no escopo e o número de documentos que precisam ser indexados novamente dentro desse escopo.

Eventos IRowsetPrioritization

Há três eventos de conjunto de linhas em IRowsetEvents::OnRowsetEvent na enumeração 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 );

Os eventos de conjunto de linhas são os seguintes:

  • O evento ROWSETEVENT_TYPE_DATAEXPIRED indica que os dados que fazem backup do conjunto de linhas expiraram e que um novo conjunto de linhas deve ser solicitado.
  • O evento ROWSET_TYPE_FOREGROUNDLOST indica que um item que tinha prioridade em primeiro plano na pilha de priorização foi rebaixado, porque outra pessoa se priorizou antes dessa consulta.
  • O evento ROWSETEVENT_TYPE_SCOPESTATISTICS fornece as mesmas informações disponíveis na chamada do método IRowsetPrioritization::GetScopeStatistics , mas por meio de um mecânico de push, da seguinte maneira:
    • O evento surgirá se a API de priorização tiver sido usada para solicitar um nível de priorização não padrão e uma frequência de evento de estatísticas não zero.
    • O evento surge somente quando as estatísticas são realmente alteradas e o intervalo especificado no IRowsetPrioritization decorrido (o intervalo não garante a frequência do evento).
    • Esse evento é garantido para gerar um estado de "salto zero" (zero itens restantes a serem adicionados, zero modificações restantes), desde que um evento diferente de zero tenha sido gerado.
    • O indexador poderá processar itens sem enviar esse evento, se a fila esvaziar antes da frequência do evento de estatísticas.

Recursos adicionais

Consulte os seguintes recursos relacionados à priorização e conjuntos de linhas:

Pesquisa do Windows 7

Novo para Pesquisa do Windows 7

Bibliotecas do Windows Shell no Windows 7