2012-05-03 14 views
4

私はコントローラで特定のドキュメントを削除する必要があるこのメソッドを持っています。いくつかの記事では、ドキュメントを削除する最善の方法はIndexWriterを使用していると読んでいます。しかし、私はそれを動作させることはできません。これは私のコードLuceneNetでindexWriterを使用してドキュメントを削除する方法

私の指数である:

var article1 = new Document(); 
       article1.Add(new Field("Id", "1", Field.Store.YES, Field.Index.ANALYZED)); 
       article1.Add(new Field("Author", "Author", Field.Store.YES, Field.Index.ANALYZED)); 
       article1.Add(new Field("Title", "Title", Field.Store.YES, Field.Index.ANALYZED)); 

    var directory = FSDirectory.Open(new DirectoryInfo(IndexRoute)); 
      var analyzar = new StandardAnalyzer(Version.LUCENE_29); 

      var writer = new IndexWriter(directory, analyzar, true, IndexWriter.MaxFieldLength.LIMITED); 

      writer.AddDocument(article1); 
      writer.Optimize(); 
      writer.Commit(); 
      writer.Close(); 

方法は、削除します

public void Delete(string id) 
{ 
    var directory = FSDirectory.Open(new DirectoryInfo(IndexRoute)); 
    var analyzar = new StandardAnalyzer(Version.LUCENE_29); 
    var writer = new IndexWriter(directory, analyzar, true, IndexWriter.MaxFieldLength.LIMITED); 
    var term = new Term("Id", id); 
    writer.DeleteDocuments(term); 
    writer.Optimize(); 
    writer.Commit(); 
    writer.Close(); 
} 

の方法 "削除" のボイドを起動するコントローラで:

だから、
public ActionResult Delete() 
    { 
     _carService.Delete("1"); 
     return RedirectToAction("Index", "Home"); 
    } 

私は私のエラーを見つけることができません、少し助けてください...

答えて

3

idフィールドをField.Index.ANALYZEDとして保存しているので、idフィールドを常にField.Index.NOT_ANALYZEDとして保存してください。そうすれば、そのようなフィールドはトークン化されずにそのままインデックスに格納されます。インデックス作成時に変更したくない他のフィールドと同じです。

+2

+1は、キーを分析すべきではないと言及しています。しかし、StandardAnalyzerは、質問で使用される基本整数キーを使いこなすことはありません。 – sisve

10

あなたがそのような削除方法についてごIndexWriterを構築:

new IndexWriter(directory, analyzar, true, IndexWriter.MaxFieldLength.LIMITED); 

あなたはすべてのドキュメントを削除、空のいずれかで、既存のインデックスを上書き作成パラメータ、にtrueを指定しています。

+0

時にはいくつかの細部を忘れて、それにこだわったことがあります。私は髪の毛を裂いて、ここに着いた。インデックスコンストラクタを調べると、「作成」パラメータがtrueに固定されていました。思い出してくれてありがとう。 –

関連する問題