Индексирование приоритетов и событий набора строк в 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::OnRowsetEvents в перечислении 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