2016-09-01 6 views
1

私はpdfファイルのインデックスを作成するのにlucene.netを使用しています。インデックスをリフレッシュした後、同じdocumnetを複数回表示します(=インデックスをリフレッシュする回数)。lucene.netのインデックスに重複する文書

最新のlucene.netインデックス(Lucene.net 3.0.3)を使用しています。

ここはインデックス作成のためのコードです。

public void refreshIndexes() 
    { 
     // Create Index Writer 
     string strIndexDir = @"Z:\Munavvar\LuceneTest\index"; 
     IndexWriter writer = new IndexWriter(Lucene.Net.Store.FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir)), new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true, IndexWriter.MaxFieldLength.UNLIMITED); 

     writer.DeleteAll(); 
     // Find all files in root folder create index on them 
     List<string> lstFiles = searchFiles(@"Z:\Munavvar\LuceneTest\PDFs"); 
     foreach (string strFile in lstFiles) 
     { 
      Document doc = new Document(); 
      string FileName = System.IO.Path.GetFileNameWithoutExtension(strFile); 
      string Text = ExtractTextFromPdf(strFile); 
      string Path = strFile; 
      string ModifiedDate = Convert.ToString(File.GetLastWriteTime(strFile)); 
      string DocumentType = string.Empty; 
      string Vault = string.Empty; 

      string headerText = Text.Substring(0, Text.Length < 150 ? Text.Length : 150); 
      foreach (var docs in ltDocumentTypes) 
      { 
       if (headerText.ToUpper().Contains(docs.searchText.ToUpper())) 
       { 
        DocumentType = docs.DocumentType; 
        Vault = docs.VaultName; ; 
       } 
      } 

      if (string.IsNullOrEmpty(DocumentType)) 
      { 
       DocumentType = "Default"; 
       Vault = "Default"; 
      } 

      doc.Add(new Field("filename", FileName, Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("text", Text, Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("path", Path, Field.Store.YES, Field.Index.NOT_ANALYZED)); 
      doc.Add(new Field("modifieddate", ModifiedDate, Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("documenttype", DocumentType, Field.Store.YES, Field.Index.ANALYZED)); 
      doc.Add(new Field("vault", Vault, Field.Store.YES, Field.Index.ANALYZED)); 

      writer.AddDocument(doc); 
     } 
     writer.Optimize(); 
     writer.Dispose(); 
    } 

は、ここで私はrefreshIndexesメソッドを呼び出して、ウィンドウ上のボタンを一つ持っている私のインデックスsearcingコード

public List<IndexDocument> searchFromIndexes(string searchText) 
    { 
     try 
     { 
      #region search in indexes and fill list 
      // Create list 
      List<IndexDocument> searchResult = new List<IndexDocument>(); 

      if (!string.IsNullOrEmpty(searchText)) 
      { 
       string strIndexDir = @"Z:\Munavvar\LuceneTest\index"; 
       var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); 
       IndexSearcher searcher = new IndexSearcher(Lucene.Net.Store.FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir))); 

       // parse the query, "text" is the default field to search 
       Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer); 


       Query query = parser.Parse(searchText); 

       // search 
       TopDocs hits = searcher.Search(query, searcher.MaxDoc); 

       // showing first TotalHits results 
       for (int i = 0; i < hits.TotalHits; i++) 
       { 
        // get the document from index 
        Document doc = searcher.Doc(hits.ScoreDocs[i].Doc); 

        // create a new row with the result data 
        searchResult.Add(new IndexDocument() 
         { 
          FileName = doc.Get("filename"), 
          Text = doc.Get("text"), 
          Path = doc.Get("path"), 
          ModifiedDate = doc.Get("modifieddate"), 
          Vault = doc.Get("vault"), 
          DocumentType = doc.Get("documenttype"), 
         }); 

       } 
       searcher.Dispose(); 
      } 
      return searchResult; 
      #endregion 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

UPDATE

です。

それは私が閉じるときに、古いインデックスをクリアし、再度アプリケーションを実行し、

+0

の第三引数に応じて新しい文書 を作成してはいけません。ところで、ltDocumentTypes'とは何か –

+1

@RichaGarg - 'IndexWriter' ctorの3番目の引数は、既存のインデックス(存在する場合)を上書きするか、追加するかを指定します。それは '真である '、古いインデックス*は削除すべきです。 – femtoRgon

+1

このインデックスの検索方法に関する情報を提供できますか?私が疑問に思っているのは、古い読者をどこかに開いておくことが可能なのかどうかということです。あなたは 'MultiReader'などでそれらを収集しなければならないように思えますが... – femtoRgon

答えて

0

は、解決策を考え出す、そのボタンをクリックします。

問題: グローバルクラスオブジェクトからrefreshIndexesメソッドを呼び出しています。

VaultIndexes vIndexes = new VaultIndexes(); 
private void btnRefreshIndex_Click(object sender, RoutedEventArgs e) 
{ 
    vIndexes.refreshIndexes(); 
} 

解決策: 毎回新しいオブジェクトオブジェクトを作成します。

private void btnRefreshIndex_Click(object sender, RoutedEventArgs e) 
{ 
    VaultIndexes vIndexes = new VaultIndexes(); 
    vIndexes.refreshIndexes(); 
} 

私はそれがグローバルクラス オブジェクトと重複する文書を作成している理由を知りません。コメントで@RichaGarg状態として

、それはあなたが以前のデータを削除する必要があり、あるためだIndexWriter

IndexWriter writer = new IndexWriter(Lucene.Net.Store.FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir)), new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true, IndexWriter.MaxFieldLength.UNLIMITED); 
関連する問題