2013-01-01 60 views
0

這是我的代碼搜索Lucene索引,Lucene的IndexSearcher的導致OutOfMemoryException異常

String [email protected]"c:\Test1.txt"; 
if (File.Exists(DocPath)) 
{ 
    StreamReader Reader = new StreamReader(DocPath); 

    StringBuilder Content = new StringBuilder(); 
    Content.Append(Reader.ReadToEnd()); 

    if (Content.ToString().Trim() != "") 
    { 
     FSDirectory Direc = FSDirectory.Open(new DirectoryInfo(IndexDir)); 
     IndexReader Reader = IndexReader.Open(Direc, true); 
     IndexSearcher searcher = new IndexSearcher(Reader); 
     QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Content", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29, new FileInfo(Application.StartupPath + Path.DirectorySeparatorChar + "noise.dat"))); 
     BooleanQuery.MaxClauseCount = Convert.ToInt32(Content.ToString().Length); 
     Query query = parser.Parse(QueryParser.Escape(Content.ToString().ToLower())); 
     TopDocs docs = searcher.Search(query, Reader.maxDoc); 
    } 
} 

在這段代碼中,我打開15MB的一個文本文件,並給它的索引搜索。搜索需要很長時間,顯然會引發OutOfMemoryException。它甚至需要時間來解析查詢。索引大小約爲16K文檔。

+0

您是否正在尋找與Test1.txt完全相同的文檔? –

+0

是的,我正在嘗試查找與test1相同的文檔。 – user1051536

+0

如果您嘗試查找完全匹配,我認爲您不需要在該字段上使用分析儀。這可能會大大減少查詢的大小。但是,15MB查詢可能太大了。 – goalie7960

回答

2

我建議你改變你的方法。在文檔中,存儲一個包含文件散列的附加字段,例如MD5散列。

使用你的輸入來計算它的散列值,併爲該散列值發出一個查詢,並將匹配的文檔與你的輸入進行比較以求相等。

它會更強大,並且可能會更高性能。

+0

我沒有使用你的方法,但它返回0 docs.But我猜這個方法將只返回文檔是100%匹配..bcoz我存儲哈希值和查詢散列值,所以它會返回0 docs bcoz上mdhash值匹配 – user1051536

相關問題