我有一个文本列,其中包含来自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可以完成我正在尝试做的事情吗? 感谢
答案 0 :(得分:4)
我能想到的唯一方法是使用专用的搜索引擎。我之前使用Lucene.NET做了类似的事情,而且相对简单。您可能还想查看SimpleLucene以使您的生活更轻松。
然而,添加一个全新的搜索引擎需要时间投入,这可能是不可行的。
答案 1 :(得分:0)
我不确定您的要求是否可以用此解决,但您可以创建一个带有正则表达式的SQL表达式列(doc)。这样您就可以将解析任务传递给SQL服务器。