Обновление инвертированного индекса

E
На сайте с 12.01.2004
Offline
17
1005

Доброго времени суток.

Интересует вопрос, каков наиболее оптимальный способ обновления (перестроики) инвертированного индекса? Как известно, при обновлении даже небольшого количества документов (к примеру 1-2% от общего количества документов в индексе) в индексном файле приходится перестраивать множество постлистов, что по сути приводит к полной перестройки всего файла индекса. Предлагаю обсудить следующие способы:

Способ А (сегментирование):

Вся колекция документов разбивается на сегменты. Для каждого сегмента строится свой индекс. Например, если у нас имется 1000 документов - мы можем их разбить на 10 сегментов по 100 документов в каждом и построить 10 индексных файлов. Соответственно при поиске мы будем получать список состоящий из N наиболее релевантных документов для каждого сегмента, затем объединять эти списки (по OR) в порядке релевантности документов.

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

Другой приятный момент такого способа - возможность разносить полученные файлы индексов на разные машины (и/или диски), что позволит выполнять запросы параллельно.

Способ Б (ревизии):

Этот способ позволяет избежать полной перестройки файла индекса и обновлять только небольшую часть списка документов. Для каждого обновления индекса мы будем создавать отдельный файл индекса, который назовем ревизией. Для каждой ревизии (читай индекса) будем сохранять список id документов которые в содержатся в файле индекса ревизии. При построении новой ревизии мы будем удалять из списков документов предыдущих ревизий документы которые мы только что периндексировали. Поясню на примере:

1) В первый раз строим индекс A и сохраняем список A_doclist всех документов которые содержаться в этом индексе.

2) Строим индекс B и сохраняем список документов B_doclist. Затем из списка A_doclist удаляем все id документов которые содержатся в B_doclist.

3) Строим индекс C и сохраняем список документов C_doclist. После этого и из A_doclist и из B_doclist удаляем id документов из c_doclist. И т.д.

При поиске мы будем иметь 3 индексных файла и 3 списка документов. Для каждого индекса извлечем постлист искомого терма(слова) и объединим (по AND) со своим списком id документов. Затем объединим (по OR) полученные списки для каждой ревизии:

merge_AND(A_postlist, A_doclist) OR merge_AND(B_postlist, B_doclist) OR merge_AND(C_postlist, C_doclist).

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий