2016-03-20 7 views
0

Ich war Indizierung mit lucene.net in WPF C# und plötzlich bekam das neue jedes neue Dokument wurde anstelle der vorherigen hinzugefügt und damit jeden Moment Anzahl der Dokumente im Index war 1Wie man das Umschreiben des Index Lucene.net C# stoppt?

Ich weiß nicht wie kann Dies geschieht, weil ich die gleichen Methoden zum Hinzufügen in C# -Konsole getestet habe, aber in Formularen ist es nur etwas seltsames passieren

Können Sie nicht vorschlagen, wie Sie das Problem lösen?

Dies ist der Code, wo die Methode Index

private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      LuceneSearch.LuceneEngine le = new LuceneSearch.LuceneEngine(); 
      var engine = new FileEngine(); 

      if (txtboxName.Text != "" && cmbboxDis.SelectedIndex != -1 && btnFile.Content.ToString() != "Choose a file") 
      {//adds some stuff to DB and returns an object to index 
       var IndexMe= engine.AddFile(txtboxName.Text, cmbboxDis.SelectedIndex, txtboxAuth.Text, txtboxTags.Text, txtboxComment.Text); 
       le.BuildIndex(IndexMe);//index this file 

       this.Close(); 
      } 
      else 
       MessageBox.Show("Not all fields are filled", "Oops!", MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("You haven't chosen a file! " +ex.Message, "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
    } 

genannt zu schaffen ist, dass die Art und Weise ist, wie es in der Klasse von lucene Methoden sieht

namespace StudentWorksSearch.LuceneSearch 
{ 
public class LuceneEngine 
{//get directory 
     private const string _luceneDir = "../../../Data/lucene_index1"; 
    private FSDirectory _directoryTemp; 
    private FSDirectory _directory 
    { 
     get 
     { 
      if (_directoryTemp == null) _directoryTemp = FSDirectory.Open(new 
     DirectoryInfo(_luceneDir)); 
      if (IndexWriter.IsLocked(_directoryTemp)) IndexWriter.Unlock(_directoryTemp); 
      var lockFilePath = Path.Combine(_luceneDir, "write.lock"); 
      if (File.Exists(lockFilePath)) File.Delete(lockFilePath); 
      return _directoryTemp; 
     } 
    } 


    //this method creates document from an ObjectToIndex 
    public void BuildIndex(FileToIndex file) 
    { 
     using (var analyzer = new Lucene.Net.Analysis.Ru.RussianAnalyzer(Version.LUCENE_30)) 
     { 
      using (IndexWriter idxw = new IndexWriter(_directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED)) 
      { 
       //check if document exists, if true deletes existing      
       var searchQuery = new TermQuery(new Term("Id", file.Id.ToString())); 
       idxw.DeleteDocuments(searchQuery); 
       //creation 
       Document doc = new Document(); 
       doc.Add(new Field("Id", file.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));//аналайзер разбивает строки на слова 
       doc.Add(new Field("Title", file.Title, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("Description", file.Description, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("Authors", file.Authors, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("Text", file.Text, Field.Store.YES, Field.Index.ANALYZED)); 
       doc.Add(new Field("Hashtags", file.Hashtags, Field.Store.YES, Field.Index.ANALYZED)); 
       //write the document to the index 
       idxw.AddDocument(doc); 

       //optimize and close the writer 
       idxw.Commit(); 

       idxw.Optimize();     
      } 
     } 
    } 

Antwort

2

Das dritte Argument für das Indexwriter-Konstruktor legt fest, ob es einen neuen Index erstellen soll. Wenn es auf true festgelegt ist, überschreibt es einen vorhandenen Index und erstellt einen neuen Index. Sie sollten es auf false setzen, um einen vorhandenen Index zu öffnen:

IndexWriter idxw = new IndexWriter(_directory, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED 
+0

danke so viel !!!! – erkatya90