1

PDF、Word、Excel などのプレーン テキストを含むテキスト列があります。SQL を使用したフレーズの検索はうまく機能します。

ユーザーは、ファイルを開く前に、検索語句を含むテキストの抜粋を見たいと考えています。SQL は句が列のどこにあるかを返さないため、正規表現を使用して検索して表示することにしました。

テキストが大きい場合、27 MBのCPU が 100% 近くまで跳ね上がり、処理が遅くなります。正規表現パターンは、検索語の前後にある 5 つの単語を取得します。

コードは次のとおりです。

 HashSet<string> str = new HashSet<string>();

            foreach (string sPhrase in searchArr)
            {
                string sPattern;
                if (sPhrase.Contains("*"))
                    sPattern = sPhrase.Replace("*", @"\w*");
                else
                    sPattern = sPhrase;

                string pattern = "(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,5}" + sPattern + "(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,5}";
                Debug.Write(string.Format("Pattern:{0}\n\r",pattern));

                Regex reg = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
                Match match = reg.Match(Text);

                while (!String.IsNullOrEmpty(match.Value))
                {
                    string s = match.Value;
                    if (s.Contains("\n\r"))
                        s = s.Replace("\n\r", " ");

                    s = s.Replace("\n", " ");
                    s = s.Replace("\r", " ");

                    //Checks for dups
                    if (!str.Contains(s))
                    {
                        str.Add(s);
                        AttachmentSearchResult r = new AttachmentSearchResult(s);

                        yield return r;
                    }

                    match = match.NextMatch();
                }
            }

私は何を間違っていますか?メモリ内のすべてのテキストを取得して検索する以外に良い方法はありますか? または、SQL 2005 は私がしようとしていることを達成できますか? ありがとう

4

2 に答える 2

4

これを行う唯一の方法は、専用の検索エンジンを使用することです。以前にLucene.NETを使用して同様のことを行ったことがありますが、比較的簡単でした。SimpleLuceneを調べて、生活を楽にすることもできます。

ただし、まったく新しい検索エンジンを追加するには、時間の投資が必要になるため、実行できない場合があります。

于 2012-10-17T17:46:51.793 に答える
0

これで要件を解決できるかどうかはわかりませんが、正規表現を含むSQL式列を作成できます(doc)。このようにして、SQLサーバーに解析義務を渡すことができます。

于 2012-10-17T17:47:25.663 に答える