基于模式(正则表达式)的搜索系统

时间:2009-11-25 18:14:08

标签: c# regex full-text-search

我正在寻找一种方法来搜索数TB的数据以匹配正则表达式的模式。该实现确实需要支持正则表达式的许多更精细的功能,例如行开始和结束数据,完全TR1支持(最好具有POSIX和/或PCRE支持)等。我们正在有效地使用此应用程序来测试有关存储潜在敏感信息的政策。

我已经研究过索引解决方案,但是大多数商业套件似乎都没有我们想要的更好的正则表达式功能(到目前为止,它们在解析复杂的正则表达式时都完全失败了我们使用)。

这是一个复杂的问题,因为我们拥有大量的数据,以及我们必须专注于扫描任务的系统资源量(不多,它只是检查政策合规性,所以没有那里的硬件预算很多。)

我调查了Lucene,但我对使用不能完全处理我们的正则表达式电池的索引系统有点犹豫,而在搜索整个数据集时可以解决这个问题,我们必须让服务器至少在几周内执行这些操作。

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

您可能需要查看Apache Hadoop。像雅虎和Facebook这样的大型网站使用Hadoop进行各种处理,其中一个就是处理多TB的文本日志。

在Hadoop文档中,有一个分布式Grep示例,可以扩展以处理任何可达到的数据集大小。

如果你想推出自己的解决方案,Hadoop API中还有一个SequenceFileInputFilter.RegexFilter。

答案 1 :(得分:1)

PowerGREP可以处理任何正则表达式,并且专门用于此目的。我发现它可以非常快速地搜索大量数据,但我还没有尝试过TB级的数据。但是,因为有30天的试用期,所以值得一试,我会说。

在搜索文件的特定部分时,它特别强大。您可以根据自己的条件对文件进行分区,然后仅对这些部分应用其他搜索。此外,它还具有非常好的报告功能。

答案 2 :(得分:1)

我只能提供高级答案。在Tim和shadit的答案的基础上,使用在EC2或Azure Compute上作为MapReduce算法实现的两遍方法。在每次传递中, Map 可以获取带有标识符的数据块,如果找到匹配则返回 Reduce 标识符,否则返回null值。根据需要缩放它以缩短处理时间。

答案 3 :(得分:0)

grep程序针对文件中的正则表达式搜索进行了高度优化,我认为你无法用任何通用的正则表达式库击败它。即使这对于搜索太字节来说也是不切实际的,所以我认为你在进行完整的正则表达式搜索时运气不佳。

一个选项可能是使用索引器作为第一遍找到可能的匹配,然后在每个匹配的任一侧提取一些字节并在其上运行完整的正则表达式匹配。

答案 4 :(得分:0)

免责声明:我不是搜索专家。

如果你真的需要regexp的所有通用性,那么没有什么比浏览所有数据更好(但请参阅下面有关加快速度的评论)。

但是,我猜这不是真的。所以要做的第一件事就是看看你是否可以使用索引来识别可能的文档。例如,如果您知道所有匹配项都包含一个单词(任何单词),那么您可以索引单词,使用它来查找包含该单词的(希望很小)文档集,然后使用grep或等效单词仅限于那些文件。

因此,例如,您可能需要在行的开头找到具有“FoObAr”的文档。你将从无壳索引开始识别在任何地方都有“foobar”的文件,然后grep(仅)那些“^ FoObAr”。

接下来,如何尽快grep。你可能会被速度限制。所以看看使用几个磁盘(可能不需要使用raid - 你可以在每个磁盘上只有一个线程)。另外,考虑压缩。你不需要随机访问这些文件,如果它们是文本(我假设它们是你正在使用它们),那么它们将很好地压缩。这将减少您需要读取(和存储)的数据量。

最后,请注意,如果您的索引不适用于所有查询,那么它可能不值得使用。你可以在一次通过中“grep”所有表达式,而昂贵的进程是读取数据,而不是grep的细节,所以即使存在无法索引的“只有一个”查询,因此你需要扫描一切,然后建立和使用索引可能不是很好地利用你的时间。