5

特定のドキュメントを削除する必要があるコントローラーで呼び出すこのメソッドがあります。Document を削除する最良の方法は 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");
    }

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

4

2 に答える 2

12

そのような削除メソッド用に IndexWriter を構築すると、次のようになります。

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

create パラメーターに true を指定すると、既存のインデックスが空のインデックスで上書きされ、すべてのドキュメントが削除されます。

于 2012-05-04T18:09:57.643 に答える
4

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

于 2012-05-04T05:58:05.380 に答える