2008-10-02 91 views
8

以下是我遇到的问题,我有一组日志可以相当快速地增长。它们每天都被分割成单独的文件,并且这些文件可以轻松地成长为一个演出。为了减小尺寸,超过30天左右的条目被清除。通过日志进行快速文本搜索

问题是当我想要搜索某些字符串的这些文件。现在,Boyer-Moore的搜索速度非常缓慢。我知道像dtSearch这样的应用程序可以使用索引提供非常快速的搜索,但我不确定如何实现该功能,而不占用日志占用空间的两倍。

有没有任何资源可以帮我查看?我真的在寻找一种标准的算法来解释我应该如何构建索引并使用它来进行搜索。

编辑:
由于此搜索需要集成到跨平台应用程序中,因此Grep不起作用。我无法摆动任何外部程序。

它的工作方式是有一个Web前端具有日志浏览器。这涉及到一个自定义的C++ Web服务器后端。该服务器需要在合理的时间内搜索日志。目前通过几个日志搜索需要时间。

编辑2: 其中一些建议很好,但我必须重申,我无法整合其他应用程序,这是合同的一部分。但是要回答一些问题,日志中的数据会因接收到的医疗保健特定格式的消息或与这些消息相关的消息而有所不同。我期望依靠索引,因为虽然重建索引可能需要一分钟时间,但搜索目前需要很长时间(我已经看到这需要长达2.5分钟)。而且,甚至在记录之前,很多数据都被丢弃。除非打开某些调试日志记录选项,否则超过一半的日志消息将被忽略。

搜索基本上是这样的:网页表单上的用户会看到最近消息的列表(当他们滚动时从磁盘进行流式传输,对于ajax而言是流式传输),通常他们需要搜索消息在其中包含一些信息,可能是患者ID或他们发送的一些字符串,因此他们可以将字符串输入到搜索中。搜索以异步方式发送,自定义Web服务器每次线性搜索日志1MB以获得一些结果。当日志变大时,此过程可能需要很长时间。这正是我想要优化的。

+0

尝试使用grep作为外部工具,如果其足够快,您可以使用gnu grep源代码并将其直接集成到您的应用程序中。 – gbjbaanb 2008-10-02 18:44:19

+0

我想要,但如果将其包含在内,这是一个法律问题,我问过要走这条路。 – ReaperUnreal 2008-10-02 19:37:42

回答

2

查看Lucene用来做它的事情的算法。不过,它们不太可能非常简单。我不得不一次一次研究这些算法,其中一些算法非常复杂。

如果您可以识别要索引的文本中的“单词”,只需构建一个大单哈希表,将单词的散列映射到每个文件中的单词。如果用户频繁地重复相同搜索,请缓存搜索结果。搜索结束后,您可以检查每个位置,以确认搜索词落在那里,而不仅仅是一个匹配哈希值的词。

另外,谁真的在乎索引是否大于文件本身?如果你的系统真的如此庞大,有那么多活动,对于世界末日来说,索引是几十场演出?

5

grep对于大日志(有时是12G +),我通常可以很好地工作。您也可以找到windows here的版本。

0

有关您正在执行的搜索类型的更多详细信息肯定会对您有所帮助。为什么,特别是你想要依赖索引,因为每当日志翻转时你必须重建它?这些日志中有什么样的信息?它甚至可以在甚至被记录之前被丢弃吗?

这些搜索现在需要多长时间?

-2

Splunk是伟大的,通过大量的日志搜索。可能是为了你的目的矫枉过正。您根据您要处理的数据量(日志大小)进行支付。我非常肯定他们有一个API,所以如果你不想使用它们,你不必使用它们的前端。

0

您可能想查看BSD grep的来源。你可能无法依赖grep在你身边,但没有人说你不能重新创建类似的功能,对吧?