2012-05-03 2 views
4

У меня есть этот метод, который я вызываю в своем контроллере, который должен удалить определенный документ. В некоторых статьях я читал, что лучший способ удалить документ - использовать IndexWriter. Но я не могу заставить его работать. Это мой кодКак удалить документ с помощью indexWriter в LuceneNet

Мой индекс:

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

Вы задаете верно для параметра создания, который переписывает существующий индекс с пустым, удалив все документы.

+0

Иногда мы забыли некоторые детали и застряли с ним. Я собирался сорвать мои волосы, а затем приехал сюда. Когда я посмотрел на свой конструктор индекса, параметр «create» был исправлен в true. Спасибо за напомню. –