0

これは、Luceneインデックスを検索するための私のコードです。

String DocPath=@"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のテキストファイルを1つ開いて、インデックスサーチャーに渡します。検索には非常に長い時間がかかり、明らかに。をスローしOutOfMemoryExceptionます。クエリの解析にも時間がかかります。インデックスサイズは約16Kドキュメントです。

4

1 に答える 1

2

アプローチを変えることをお勧めします。ドキュメントとともに、たとえば MD5 ハッシュなど、ファイルのハッシュを含む追加のフィールドを保存します。

入力を使用してそのハッシュを計算し、そのハッシュのクエリを発行し、一致するドキュメントを入力と比較して等しいかどうかを確認します。

はるかに堅牢になり、おそらくパフォーマンスも向上します。

于 2013-01-03T14:45:21.303 に答える