How To Delete a Document using indexWriter in Luce

2019-05-06 18:17发布

I have this method that I invoke in my controller that have to delete a specific Document. I read in some articles that the best way to delete a Document is using a IndexWriter. But I can't make it work. This is my code

My Index:

    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();

The method delete:

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();
}

The method in the controller that invoke the "delete" void:

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

So I can't find my error,a little help please...

2条回答
老娘就宠你
2楼-- · 2019-05-06 18:58

When you build your IndexWriter for the delete method like that:

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

You are specifying true for the create parameter, which overwrites the existing index with an empty one, deleting all your documents.

查看更多
叼着烟拽天下
3楼-- · 2019-05-06 19:00

That's because you're storing you id field as Field.Index.ANALYZED, you should always store id fields as Field.Index.NOT_ANALYZED, so that such fields won't be tokenized and will be stored in the index as is. Same for other fields that you don't want to be changed on indexing.

查看更多
登录 后发表回答