Как определить, существует ли индекс Lucene.Net в папке?

Я использую Lucene.Net для индексации и поиска документов, и я использую следующий код для создания или открытия индекса, если он существует:

IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists);

...

private bool IndexExists
{
    get
    {
        return ??
    }
}

Теперь, как можно просто реализовать IndexExists? Мне не нужны исключения.


person Elias Haileselassie    schedule 16.06.2009    source источник


Ответы (5)


Статический метод IndexReader.IndexExists (строковый путь) (или одна из его перегрузок) кажется вполне подходящим.

person Marcus    schedule 16.06.2009
comment
Сейчас это называется DirectoryReader.indexExists: lucene.apache.org/core/8DirectoryReader.indexExists0/core/org/apache/lucene/index/ - person Travis Parks; 05.09.2020

Вы можете просто использовать конструктор, который не принимает логический параметр. Это откроет существующий индекс, если он есть, или создаст новый, если он не существует.

Ссылка на документацию Java (такая же для Lucene.Net): http://lucene.apache.org/java/2_3_1/api/org/apache/lucene/index/IndexWriter.html#IndexWriter(org.apache.lucene.store.Directory, org.apache.lucene.analysis.Analyzer)

person Sean Carpenter    schedule 17.06.2009
comment
Lucene.net не имеет такой перегрузки. - person Marek; 12.01.2010
comment
В какой версии Lucene.Net отсутствует перегрузка? Это есть в версии 2.4. - person Sean Carpenter; 13.01.2010
comment
Я использую прямую Java Lucene. IndexWriter в 4.10. + Имеет только один конструктор. Но я не понимаю, как вы можете получить то, что спрашивающий хотел от вашего решения: выяснить, есть ли там уже индекс. - person mike rodent; 03.11.2016

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

private bool IndexExists {получить {вернуть IndexDirectory.FileExists ("сегменты.gen"); }}

person Gustavo Melo    schedule 06.07.2011
comment
Умный ... и, возможно, лучший способ на данный момент (см. Мой ответ: 4.10. + Изменил спецификацию DirectoryReader.indexExists() с 4.0. +). Но, конечно, как я уверен, вы знаете, ваше решение очень уязвимо для изменений версии. Каждую новую версию придется проверять! - person mike rodent; 03.11.2016

Я знаю, что это старая запись, но то, что опубликовал Шон Карпентер, совершенно верно, и этот конструктор существует даже в последней версии Lucene .NET. Документацию по классу IndexWriter можно найти здесь:

person awsomedevsigner    schedule 09.08.2013

Ой!

Это «чистая Java» Lucene, но она вполне может относиться к другим разновидностям.

В Lucene 4.0.0 API для DirectoryReader.indexExists() говорит

Возвращает истину, если индекс существует в указанном каталоге.

Но в Lucene 4.10.2 API для DirectoryReader.indexExists() говорит

Возвращает истину, если индекс, вероятно, существует в указанном каталоге. Обратите внимание: если существует поврежденный индекс или индекс находится в процессе фиксации

... да, это обрывается на середине предложения. NB Я скомпилировал свою Javadoc прямо из источника, но ту же незаконченную фразу можно увидеть в онлайн-API. Не только это, но я посмотрел на API Lucene 6.0.0, и он точно такой же.

Однако фраза «возвращает»:

истина, если индекс существует; ложь иначе

... но в настоящее время я считаю, что пустой каталог иногда (?) возвращает true (из моего модульного тестирования). В любом случае, я бы этому не поверил.

Если вы создаете IndexReader в пустом каталоге, кажется, что все его методы вернутся без исключения исключений. Вы можете пойти indexReader.numDocs(), и это вернет 0, но это не доказывает, что там нет индекса, а только то, что нет Documents. Конечно, в зависимости от ваших требований этого может быть достаточно.

Точно так же вы можете создать IndexSearcher из такого IndexReader, а можете создать IndexWriter. Ни у одного из них не будет явных проблем с пустым каталогом.

ЛУЧШЕЕ РЕШЕНИЕ:

    try {
        directoryReader = DirectoryReader.open( fsDir );
    } catch ( org.apache.lucene.index.IndexNotFoundException e) {
        ...
    }

Насколько я могу судить, это кажется надежным.

person mike rodent    schedule 03.11.2016