Lucene .Net процесс оптимизации - PullRequest
2 голосов
/ 27 февраля 2012

Я создаю индекс, используя Lucene .Net 2.9.2. После большого индексирования индекс имеет много сегментов и удаленных документов, поэтому я вызываю Optimize (numSegmets) для IndexWriter.

Количество сегментов индекса действительно уменьшено до значения numSegmets , но оно все еще имеет удаления ... разве вызов Optimize не должен также удалять все удаленные документы?

Мой вопрос очень важен, чтобы я мог знать, так ли это работает в Lucene или, может быть, у меня есть какая-то ошибка ...

Edit: вот мой фрагмент кода:

IndexWriter writer = new IndexWriter(/*open writer from index directroy*/);
writer.Optimize(5);
writer.Commit();

bool hasDeletions = writer.HasDeletions();

hasDeletions верно, в то время как я ожидал, что это будет ложно ...

Ответы [ 3 ]

5 голосов
/ 27 февраля 2012

Удаление может остаться, если вы не укажете 1 в качестве максимального количества сегментов.

Но тебе не стоит об этом беспокоиться. Цитировать документацию для IndexWriter # optimize в Lucene 3.5

Этот метод устарел, так как он ужасно неэффективен и очень редко оправдан. Производительность многосегментного поиска Lucene со временем улучшилась, и TieredMergePolicy по умолчанию теперь нацеливает сегменты с удалениями.

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

Оптимизация объединяет сегменты, и во время объединения сегментов она удаляет удаления, которые перечислены в каждом из них.Если вы не выполните полную оптимизацию, удаления могут остаться, поскольку сегменты не объединены / перестроены.

Это не означает, что вам нужно выполнить полную оптимизацию для удаления удалений..

IndexWriter writer = GetIndexWriter();
// delete some stuff
writer.ExpungeDeletes();

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

1 голос
/ 08 марта 2013

Оптимизация, кажется, удаляет весь индекс?

Я новичок в Lucene.NET - но у меня он подключен, и все кажется великолепным!Я добавил тестовые данные, удалил элементы, а затем попытался оптимизировать (1) и ExpungeDeletes () (как показано выше) ...

, но как бы я к этому не подходил ... это не слияние иличто угодно - это просто удаление всего индекса?

мой код выглядит следующим образом (полученный из примера в сети):

public void Optimize()
{
    analyzer = new StandardAnalyzer(Version.LUCENE_30);
    using (var writer = new IndexWriter(_directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED))
    {
        analyzer.Close();
        //writer.Optimize(1);
        writer.ExpungeDeletes();
        writer.Dispose();
    }
}

Я не знаю, почему это приведет к удалению всего индекса

...