Минимизировать количество файлов индекса Lucene - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть специальное приложение, которое требует, чтобы количество файлов, составляющих индекс, было как можно меньше.Ранее, когда я использовал Lucene.NET 2.9.2, мне удалось сохранить весь индекс в 3 (или 4) файлах с помощью:

writer.SetUseCompoundFile(true);
writer.Optimize(1, true);

После обновления до Lucene.NET 2.9.4 тот же код выдаетИндекс, состоящий из 10 файлов (fdt, fdx, fnm, frq, nrm, prx, tii, tis + сегменты.gen и сегментов_c).Как я могу это снова объяснить?

Причина этого, вероятно, кроется в Lucene, а не в специфике Lucene.NET.Между версиями все еще что-то изменилось, и я бы хотел иметь контроль над этим.

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

ОК, я наконец нашел ответ. При проверке каталога индекса во время длительного процесса индексации я заметил, что CFS приходит и уходит, но как только процесс завершен, никаких признаков файла CFS нет. Я провел еще несколько исследований, учитывая некоторые новые ключевые слова (спасибо @ jf-beaulac) и Я нашел это . Они говорят, что порог по умолчанию для CFS составляет 10% от всего размера индекса. Если какой-либо сегмент растет после этого, CFS не создается независимо от использования writer.SetUseCompoundFile(true).

Итак, после некоторого изучения Lucene.NET я сделал следующий необходимый шаг:

        indexWriter.SetUseCompoundFile(true);
        var mergePolicy = indexWriter.GetMergePolicy();
        var logPolicy = mergePolicy as LogMergePolicy;
        if (logPolicy != null)
        {
            logPolicy.SetNoCFSRatio(1);
        }

Установка «no-cfs-ratio» на 100% сохраняет все сегменты в CFS, и все, наконец, работает так, как я хочу.

Итак, @ jf-beaulac, большое спасибо за то, что помогли мне. Я полагаю, ваш образец тоже потерпит неудачу, если вы добавите еще несколько документов. Тем не менее, я признаю вашу помощь и приму ваш ответ.

2 голосов
/ 01 февраля 2012

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

FSDirectory dir = FSDirectory.GetDirectory("C:\\temp\\CFSTEST");
IndexWriter writer = new IndexWriter(dir, new CJKAnalyzer());
writer.SetUseCompoundFile(true);

Document document = new Document();

document.Add(new Field(
    "text",
    "プーケット",
    Field.Store.YES,
    Field.Index.ANALYZED));
writer.AddDocument(document);

document.GetField("text").SetValue("another doc");
writer.AddDocument(document);

writer.Optimize(1, true);
writer.Close();
...