如何使用Perl对平面文件进行全文搜索搜索?

时间:2009-02-26 18:50:37

标签: perl search flat-file

我们有一个基于Perl的Web应用程序,其数据源自大量平面文本文件。这些平面文件放在我们系统的目录中,我们广泛地解析它们将信息插入MySQL数据库,然后将这些文件移动到它们的归档存储库和永久主页(/www/website/archive/*.txt)。现在,我们不会解析这些平面文件中的每一位数据,而一些较为模糊的数据项也不会被数据库化。

目前的要求是,用户能够从Perl生成的网页执行整个平面文件存储库的全文搜索,并返回他们可以单击并打开的命中列表。文本文件供审查。

启用此搜索功能的最优雅,最高效且非CPU密集型方法是什么?

4 个答案:

答案 0 :(得分:9)

我建议按此顺序:

  1. 将整个文档都整合到MySQL表中,并使用MySQL的全文搜索和索引功能。我从来没有这样做,但MySQL总是能够处理超过我可以抛出的东西。

  2. Swish-E(http://swish-e.org/)仍然存在,旨在构建全文索引并允许排名结果。我已经运行了几年而且效果很好。

  3. 您可以在Perl代码中使用File :: Find来咀嚼像grep -r这样的存储库,但与上面的一个索引选项相比,它会很糟糕。但是,它会起作用,甚至可能让你感到惊讶:)

答案 1 :(得分:3)

我建议使用专用搜索引擎进行索引和搜索。

我最近没有看过搜索引擎,但几年前我使用了ht://dig,对结果感到满意。

更新:此时看起来像ht:// dig是一个僵尸项目。您可能想要使用其他引擎。 Hyper Estraier,除了不可发音之外看起来很有希望。

答案 2 :(得分:2)

我建议添加索引机。从http://namazu.org考虑​​Namazu。当我需要它时,开始看起来比Swish-e更容易,ht:// dig并且我对它非常满意。

如果您不想要索引器的开销,请查看分支grep / egrep。一旦文本卷达到数兆字节,这将明显快于仅在Perl中扫描,例如:

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

奖励:使用日期/标签/等文件名约定来将文件集减少为grep。 笨重的find ... | xargs ...旨在解决通配符扩展的shell大小限制,您可能会使用大型档案进行扩展。

答案 3 :(得分:0)

我看到有人推荐Lucene / Plucene。查看KinoSearch,我在基于Catalyst的项目中使用了一年或更长时间,对编程/维护的性能和易用性非常满意。

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