Подтвердить что ты не робот

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

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

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

...

private bool IndexExists
{
    get
    {
        return ??
    }
}

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

4b9b3361

Ответ 1

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

Ответ 2

В < 4.0 - IndexReader.indexExists(org.apache.lucene.store.Directory)

В > 4.0 есть DirectoryReader.indexExists(org.apache.lucene.store.Directory)

Ответ 3

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

Ссылка на документацию по 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)

Ответ 4

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

частный bool IndexExists   {       получить       {           return IndexDirectory.FileExists( "segment.gen" );       }   }

Ответ 5

Я знаю, что это старая запись, но то, что опубликовал Шон Карпентер, абсолютно прав, и этот конструктор существует даже в последней версии Lucene.NET. Документацию для класса IndexWriter можно найти здесь: http://lucenenet.apache.org/docs/3.0.3/d2/d1d/class_lucene_1_1_net_1_1_index_1_1_index_writer.html#af4620c14320934601058e0e9cac9bfab

Ответ 6

Упс!

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

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

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

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

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

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

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

true, если существует индекс; false иначе

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

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

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

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

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

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