3

我们有一个基于 Perl 的 Web 应用程序,它的数据来自一个庞大的平面文本文件存储库。这些平面文件被放置在我们系统上的一个目录中,我们广泛解析它们,将一些信息插入 MySQL 数据库,然后将这些文件移动到它们的存档存储库和永久主页 (/www/website/archive/*.txt)。现在,我们不会解析这些平面文件中的每一位数据,并且一些更晦涩的数据项不会被数据库化。

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

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

4

4 回答 4

9

我建议按以下顺序:

  1. 将每个文档的全部内容放入 MySQL 表中,并使用 MySQL 的全文搜索和索引功能。我从来没有做过,但 MySQL 总是能够处理比我能处理的更多的事情。

  2. Swish-E仍然存在,旨在构建全文索引并允许排名结果。我已经运行它几年了,效果很好。

  3. 您可以File::Find在 Perl 代码中使用类似 的方法来浏览存储库grep -r,但与上面的索引选项之一相比,它会很糟糕。但是,它会起作用,甚至可能会让您大吃一惊:)

于 2009-02-27T01:15:31.517 回答
3

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

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

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

于 2009-02-26T19:03:33.910 回答
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 ...的旨在解决通配符扩展的外壳大小限制,您可能会遇到大档案。

于 2009-02-27T16:40:59.827 回答
0

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

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

于 2009-03-03T05:47:36.947 回答