Как определить, существует ли индекс Lucene.Net в папке? - PullRequest
21 голосов
/ 16 июня 2009

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

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

...

private bool IndexExists
{
    get
    {
        return ??
    }
}

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

Ответы [ 6 ]

37 голосов
/ 16 июня 2009

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

6 голосов
/ 04 марта 2013

В <4.0 - это <code>IndexReader.indexExists(org.apache.lucene.store.Directory)

В> 4.0 - это DirectoryReader.indexExists(org.apache.lucene.store.Directory)

3 голосов
/ 17 июня 2009

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

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

0 голосов
/ 03 ноября 2016

Упс!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 09 августа 2013

Я знаю, что это старая запись, но то, что опубликовал Шон Карпентер, совершенно верно, и этот конструктор существует даже в последней версии 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

0 голосов
/ 06 июля 2011

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

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

...