Lucene docID надежность - PullRequest
       12

Lucene docID надежность

0 голосов
/ 31 марта 2011

ПриветЕсли в lucene index выполняется только операция вставки (без удаления / обновления), верно ли, что docID не изменяется?и это также надежноесли это правда, я хочу использовать его для постепенной загрузки FieldCache, чтобы снизить накладные расходы при загрузке всех документов, что является лучшим решением для этого ??

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Я не совсем уверен, что вы планируете делать с кешем полей, но я понимаю, что идентификаторы документов могут меняться во время вставки в зависимости от ожидающих удалений, политик слияния и т. Д.

т.е. Идентификатор документа не должен использоваться после границы фиксации в вновь открытом считывателе индекса

Надеюсь, это поможет,

0 голосов
/ 22 мая 2011

Идентификатор документа является статическим в пределах сегмента. IndexReader.Open (обычно) открывает DirectoryReader, который объединяет несколько SegmentReader. Вам нужно будет передать «нижний» считыватель в FieldCache, чтобы население работало правильно.

Вот пример из FieldCache с часто обновляемым индексом , который гарантирует, что FieldCache читает только вновь прочитанный сегмент, а не самый верхний считыватель (который будет считаться измененным при каждой фиксации).

var directory = FSDirectory.Open(new DirectoryInfo("index"));
var reader = IndexReader.Open(directory, readOnly: true);
var documentId = 1337;

// Grab all subreaders.
var subReaders = new List<IndexReader>();
ReaderUtil.GatherSubReaders(subReaders, reader);

// Loop through all subreaders. While subReaderId is higher than the
// maximum document id in the subreader, go to next.
var subReaderId = documentId;
var subReader = subReaders.First(sub => {
    if (sub.MaxDoc() < subReaderId) {
        subReaderId -= sub.MaxDoc();
        return false;
    }

    return true;
});

var values = FieldCache_Fields.DEFAULT.GetInts(subReader, "newsdate");
var value = values[subReaderId];
...