【问题标题】:How do I do a full-text search search of flat files with Perl?如何使用 Perl 对平面文件进行全文搜索?
【发布时间】:2009-02-26 18:50:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: perl search flat-file


    【解决方案1】:

    我建议按以下顺序:

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

    2. Swish-E 仍然存在,专为构建全文索引和允许排名结果而设计。我已经运行了几年,效果很好。

    3. 1234563但是,它会起作用,甚至可能会让你大吃一惊:)

    【讨论】:

    • 既然你提到了它,我听说过关于 Swish-E 的好消息。很棒的推荐。
    • 我会支持 swish-e 的推荐。一开始有点奇怪(我发现术语令人困惑)但是一旦你过去了,它就真的非常非常好而且非常快!
    • 有人试过 MySQL 选项吗?自从我在一两个版本前注意到手册中的部分以来,我一直想弄乱它。
    • 我发现 Lucene(甚至更好的 SOLR)是最好的方法......只需运行一个 tomcat 服务器并从服务器端 perl 向它发出请求 --- 小菜一碟设置并运行。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我支持添加索引机器的建议。考虑来自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 ... 旨在解决通配符扩展的外壳大小限制,您可能会遇到大型档案。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 2012-04-16
          • 1970-01-01
          • 2011-01-15
          • 2012-07-29
          • 1970-01-01
          • 2023-03-02
          相关资源
          最近更新 更多