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 は私がしようとしていることを達成できますか? ありがとう