Поделиться через


Индексирование событий приоритета и набора строк в Windows 7

В этом разделе описывается введение индексирования с приоритизацией и событий набора строк для Windows 7.

Этот раздел организован следующим образом:

Индексирование событий приоритета и набора строк

В Windows 7 и более поздних версиях существует стек приоритетов, в котором клиент может запросить, чтобы области, используемые в конкретном запросе, имели более высокий приоритет, чем у обычных элементов.

Этот стек приоритетов имеет следующие характеристики:

  • Элементы в стеке могут иметь передний план, высокий или низкий приоритет:
    • Передний план: логика возврата пропускается и индексирование выполняется настолько быстро, насколько позволяет машина.
    • Высокий: приоритет был запрошен с обратным выходом.
    • Низкий: Запрошена приоритетность не за счет других областей на стеке, но выше неприоритезированного индексирования.
  • Любой запрос с высокой или важной степенью приоритета автоматически перемещается в верхнюю часть стека.
  • Только элемент в верхней части стека может иметь приоритет переднего плана.
  • Запрос с приоритетом переднего плана, который был понижен в приоритете, получает событие, уведомляющее его о том, что он потерял приоритет переднего плана и стал высоким приоритетом с задержкой.

Стек приоритетов задает общий приоритет элементов, обрабатываемых в индексаторе следующим образом:

  • Уведомления с высоким приоритетом отправляются без задержек и обычно отправляются только для небольшого количества элементов. Например, обозреватель Windows использует этот приоритет для небольших операций обработчика копирования.

  • Приоритетный стэк находится на вершине стека, имеет механизм отката и является последним запрошенным приоритетным запросом.

  • Второй запрос в стеке.

  • Третий запрос в стеке.

  • Четвертый запрос в стеке и т. д.

  • Обычные элементы приоритета.

  • Удаленные элементы.

    Заметка

    Элементы в каждой группе приоритезируются внутренне в соответствии с более ранней семантикой для каждого элемента.

     

Примеры использования IRowsetPriorization

Основной API для работы с приоритетом доступен через следующий интерфейс, который можно вызвать путем запроса возвращаемого набора строк:

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

Определение приоритета набора строк работает следующим образом:

  1. IRowsetPrioritization получается с помощью метода IUnknown::QueryInterface на наборе строк индексатора. DBPROP_ENABLEROWSETEVENTS необходимо задать значение TRUE с помощью метода OLE DB ICommandProperties::SetProperties перед выполнением запроса, чтобы использовать приоритет набора строк.
  2. IRowsetPrioritization::SetScopePriority задает приоритет для областей, принадлежащих запросу, и определяет интервал, с которым срабатывает событие статистики области, когда в областях запроса остаются неиндексированные документы. Это событие возникает, если для уровня приоритета задано значение по умолчанию.
  3. IRowsetPrioritization::GetScopeStatistics можно использовать для получения количества индексированных элементов в области, количества незавершенных документов, добавляемых в область, и количества документов, которые необходимо повторно индексировать в этой области.

События IRowsetPrioritization

Существует три события набора строк в IRowsetEvents::OnRowsetEvent в перечислении 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 );

События набора строк приведены следующим образом:

  • Событие ROWSETEVENT_TYPE_DATAEXPIRED указывает, что срок действия резервной копии набора строк истек и что необходимо запросить новый набор строк.
  • Событие ROWSET_TYPE_FOREGROUNDLOST указывает, что элемент, имеющий приоритет переднего плана в стеке приоритетов, был понижен, так как кто-то другой поставил приоритет перед этим запросом.
  • Событие ROWSETEVENT_TYPE_SCOPESTATISTICS предоставляет те же сведения, которые доступны через вызов метода IRowsetPrioritization::GetScopeStatistics, но через механизм передачи данных следующим образом:
    • Это событие возникает, если API приоритета использовался для запроса уровня приоритетности по умолчанию и ненулевой частоты событий статистики.
    • Событие возникает только при фактическом изменении статистики, а интервал, указанный в IRowsetPrioritization истек (интервал не гарантирует частоту события).
    • Это событие гарантированно вызывает состояние "нулевой отскок" (ноль элементов, оставшихся для добавления, ноль изменений, оставшихся), при условии, что ненулевое событие произошло.
    • Индексатор может обрабатывать элементы без отправки этого события, если очередь очищается до частоты события статистики.

Дополнительные ресурсы

Ознакомьтесь со следующими ресурсами, связанными с приоритизацией и наборами строк:

Поиск Windows 7

Новые возможности поиска Windows 7

библиотеки оболочки Windows в Windows 7