21

私は、インデックス作成や文書を検索するためLucene.Netを使用しています、と私は1つが存在する場合は、インデックスを作成または開くには、次のコードを使用しています:Lucene.Net Indexがフォルダに存在するかどうかを確認するには?

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

... 

private bool IndexExists 
{ 
    get 
    { 
     return ?? 
    } 
} 

、どのように簡単な方法でIndexExistsを実装することができますか?私は例外を投げる必要はありません。

答えて

37

静的メソッドIndexReader.IndexExists(文字列パス)(またはそのオーバーロードの1つ)はかなり適しているようです。

3

ブール値のパラメータを取らないコンストラクタを使用することができます。既存の索引が存在する場合は既存の索引が開き、存在しない場合は新しい索引が作成されます。

(Lucene.Netに同じ)は、Javaのドキュメントへのリンク: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

Lucene.netにはこのオーバーロードがありません。 – Marek

+1

どのバージョンのLucene.Netに過負荷がありませんか?それは2.4にあります。 –

+0

私は "ストレートJava" Luceneを使用しています。 4.10の 'IndexWriter'にはコンストラクタが1つしかありません。しかし、質問者があなたの解決策から求めていたものを得る方法を理解していません。既にインデックスがあるかどうかを調べてください。 –

0

が、私は成功せず、あまりにもこのanwserを探してみると、ここで私は私のコードで使用する方法です:

プライベートブールIndexExists { GET { return indexDirectory.FileExists( "segments.gen"); < 4.0で } }

+0

賢い...おそらく今のところ最良の方法です(私の答え:4.10。+は4.0より+ 'DirectoryReader.indexExists()'の仕様を変更しました)。もちろん、あなたが知っていると確信しているように、あなたのソリューションはバージョンの変更に対して非常に脆弱です。それぞれの新しいバージョンをチェックする必要があります! –

4

>は4.0でIndexReader.indexExists(org.apache.lucene.store.Directory)

である私は、これは古いエントリであることを知っているが、何ショーン・カーペンターが投稿することは完全に右であり、このコンストラクタはさえに存在するDirectoryReader.indexExists(org.apache.lucene.store.Directory)

0

おっと!

これは「ストレートJava」Luceneですが、他の品種にも当てはまります。 Luceneので

DirectoryReader.indexExists()のためのAPIを4.0.0は、インデックスが指定されたディレクトリに存在する場合

はtrueを返し述べています。 DirectoryReader.indexExists()ため

しかし、Luceneの4.10.2でのAPIは、インデックスがそう指定されたディレクトリに存在する場合

はtrueを返し述べています。破損したインデックスが存在する場合、または

をコミット の過程でインデックスが...はい、それは半ば文を途切れる場合は、その 注意。 NB私はJavadocを直接ソースからコンパイルしましたが、同じ未完成のフレーズがオンラインAPIに見られます。それだけでなく、私はLucene 6.0.0 APIを見ました。まったく同じです。

"リターン" というフレーズは、しかしです:

インデックスが存在する場合はtrue。そうでない場合はfalse

...しかし、私は現在、空のディレクトリが時々(?)返すtrue(私のユニットテストから)を返すと信じています。とにかく、私はそれを信じません。

空のディレクトリにIndexReaderを作成すると、すべてのメソッドが例外をスローせずに返されるように見えます。 indexReader.numDocs()に行くことができますが、これは0を返しますが、そこにはインデックスが存在しないことを証明するものではなく、Documentが存在しないことだけが証明されます。あなたの要求に応じて、もちろん十分かもしれません。

同様に、IndexReaderからIndexSearcherを作成し、IndexWriterを作成することができます。これらのどれも、空のディレクトリに明らかな問題がありません。

よりよい解決策:

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

これは信頼できると、私の知る限り、表示されます。

関連する問題