2009-02-26 71 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的项目上使用这一年或更长时间,对编程/维护的性能和易用性非常满意。

该页面上的警告应该考虑您的情况,但我可以证明模块的稳定性。