2016-03-20 7 views
0

私はWPF C#でlucene.netを使ってインデックスを作成していましたが、突然新しいものが追加され、以前の代わりに新しいdocが追加されました。したがって、インデックスのドキュメントの任意の瞬間の数は1インデックスの書き換えをやめる方法Lucene.net C#?

これは、私がC#Consoleでも同じ追加メソッドをテストしたが、フォームではちょっと変わったことが起きたからです。

問題を解決する方法を提案できませんか?

この

は、インデックスを作成するための方法は、それはLuceneの方法のクラスにどのように見えるかの方法だそれ

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

と呼ばれているところのコードである

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

答えて

2

IndexWriterコンストラクタ指定の3番目の引数新しいインデックスを作成する必要があるかどうか。 trueに設定すると、既存のインデックスを上書きして新しいインデックスを作成します。あなたは、既存のインデックスを開くためにfalseに設定する必要があります

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

感謝をそんなに!!!! – erkatya90

関連する問題