2008-10-02 88 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在你身邊,但沒有人說你不能重新創建類似的功能,對吧?