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...
When you build your IndexWriter for the delete method like that:
You are specifying true for the create parameter, which overwrites the existing index with an empty one, deleting all your documents.
That's because you're storing you id field as
Field.Index.ANALYZED
, you should always store id fields asField.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.