2016-03-20 36 views
0

Ben yapabilirsiniz WPF C# Lucene.Net kullanarak indeksleme yapıyor ve aniden yeni her yeni doktor yerine önceki bir eklendiğini var ve dolayısıyla endekste dokümanlar her an sayısı ben bilmiyorum 1İndeks Lucene.net C# yeniden yazımı nasıl durdurulur?

oldu mu edildi Bu, C# Konsolu'nda aynı ekleme yöntemlerini test ettiğim için oldu, ancak formlarda garip bir şey oldu

Sorunu nasıl çözeceğinizi öneremez misiniz?

Bu

dizin oluşturmak için yöntem lucene yöntemlerinin sınıfta nasıl göründüğünü yolu Yani

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

denir nerede kodudur

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

cevap

2

IndexWriter yapıcı belirttiği üçüncü argüman yeni bir dizin oluşturup oluşturmayacağı. true olarak ayarlanmışsa, mevcut dizinlerin üzerine yazılır ve yeni bir tane oluşturulur. Varolan bir dizini açmak için false olarak ayarlamanız gerekir:

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

çok teşekkürler !!!! – erkatya90