2009-02-26 98 views
3

我們有一個基於Perl的Web應用程序,其數據來源於一個龐大的平面文本文件庫。這些平面文件被放置在我們系統的一個目錄中,我們廣泛地解析他們將一些信息插入MySQL數據庫,然後將這些文件移動到他們的歸檔存儲庫和永久主頁(/www/website/archive/*.txt)。現在,我們不會解析來自這些平面文件的每一個數據位,並且一些更隱蔽的數據項不會獲得數據庫。如何使用Perl進行平面文件的全文搜索搜索?

當前的需求是用戶能夠從Perl生成的網頁中對整個平面文件庫執行全文搜索,並返回一個點擊列表,然後他們可以點擊並打開文本文件進行審查。

什麼是最優雅,高效和非CPU密集型方法來啓用此搜索功能?

回答

9

我建議,按以下順序:

  1. 整個每個文檔的吸進一個MySQL表和使用MySQL的全文搜索和索引功能。我從來沒有這樣做過,但MySQL一直能夠處理的事情超過我可以投入的。

  2. Swish-E(http://swish-e.org/)仍然存在,專爲建立全文索引並允許排名結果而設計。我已經運行了幾年,它運行得很好。

  3. 您可以在Perl代碼中使用File :: Find來查看grep -r這樣的存儲庫,但它會與上述索引選項之一進行比較。然而,它會工作,甚至可能讓你感到驚訝:)

+0

現在你提到它了,我聽說過關於Swish-E的好東西。偉大的建議。 – daotoad 2009-02-27 02:22:06

3

我建議使用專門的搜索引擎來進行索引和搜索。

我最近沒有看過搜索引擎,但幾年前我用ht://dig,並且對結果很滿意。

更新:它看起來像ht:// dig在這一點上是一個殭屍項目。你可能想要使用另一個引擎。 Hyper Estraier,除了不可發音外觀看起來很有前途。

2

我第二次建議添加索引機。從http://namazu.org考慮Namazu。當我需要它時,看起來比Swish-e更容易開始,ht://挖掘,我對它很滿意。

如果你不想索引器的開銷,看看分叉grep/egrep。一旦文本捲去多兆,這將是比在Perl只掃描顯著較快,如:

open GREP, "find $dirlist -name '$filepattern' | xargs egrep '$textpattern' |" 
             or die "grep: $!"; 
while (<GREP>) { 
     ... 
} 

獎勵:使用文件名的約定如日期/標籤/等,以減少文件集到grep 。 笨重的find ... | xargs ...是爲了解決通配符擴展的shell大小限制問題,您可能會在大型歸檔中遇到這種情況。

0

我看到有人推薦Lucene/Plucene。查看KinoSearch,我一直在基於Catalyst的項目上使用這一年或更長時間,對編程/維護的性能和易用性非常滿意。

該頁面上的警告應該考慮您的情況,但我可以證明模塊的穩定性。