gustavotroconis
gustavotroconis

Reputation: 223

How To Delete a Document using indexWriter in LuceneNet

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...

Upvotes: 5

Views: 2655

Answers (2)

Jf Beaulac
Jf Beaulac

Reputation: 5246

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.

Upvotes: 12

buru
buru

Reputation: 3210

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.

Upvotes: 4

Related Questions