2009-02-26 8 views
3

私たちはPerlベースのWebアプリケーションを持っています。そのデータは、フラットテキストファイルの膨大なリポジトリからのものです。これらのフラットファイルはシステム上のディレクトリに置かれ、情報の断片をMySQLデータベースに広範囲に解析した後、それらのファイルをアーカイブされたリポジトリと永続的なホーム(/www/website/archive/*.txt)に移動します。現在では、これらのフラット・ファイルのデータを1つずつ解析するのではなく、データ項目が不明瞭なものもあります。Perlでフラットファイルのフルテキスト検索を行うにはどうすればよいですか?

現在のところ、Perlで生成されたWebページからフラットファイルリポジトリ全体をフルテキスト検索し、クリックして開くことができるヒットリストを戻すことができますレビューのためのテキストファイル。

この検索機能を有効にするには、最もエレガントで効率的で非CPU集約的な方法は何ですか?

答えて

9

私はこの順序で、お勧めしたい:

  1. は、MySQLのテーブルにすべての文書の全体を吸うとMySQLのフルテキスト検索とインデックス作成機能を使用しています。私は決してそれをやったことはありませんが、MySQLは常に私がそれを投げられる以上のことを処理することができました。

  2. スウィッシュ-E(http://swish-e.org/)は依然として存在し、フルテキストインデックスを構築し、ランク付けされた結果を可能にするために設計されています。私は数年間それを実行してきて、それはかなりうまく動作します。

  3. PerlコードでFile :: Findを使用すると、grep -rのようなリポジトリを噛み砕くことができますが、上記のインデックス付けされたオプションのいずれかと比較すると、吸うでしょう。しかし、それは動作し、あなたを驚かすかもしれません:)

+0

あなたはそれについて言及したので、私はSwish-Eについて良いことを聞いたことがあります。素晴らしい推薦。 – daotoad

+0

私はswish-e勧告の2番目になるでしょう。最初はちょっと奇妙です(私は用語が混乱していることを発見しました)。しかし、それを過ぎると、それは本当に本当にうまくいっています。 –

+0

誰かがMySQLオプションを試しましたか?マニュアルのセクションに2〜3回前のセクションがあることに気がついたので、私はそれを混乱させたいと思っていました。 – Nathan

3

インデックスや検索に専用の検索エンジンを使用することをおすすめします。

私は最近検索エンジンを見たことがありませんが、数年前にはht://digを使用しましたが、結果に満足していました。

更新:この時点で、ht:// digはゾンビプロジェクトです。別のエンジンを使用することもできます。 Hyper Estraier、それ以外は期待できません。

2

私はインデックス作成機を追加することをお勧めします。 Namazuをhttp://namazu.orgから考えてください。私がそれを必要とした時、Swish-e、ht:// digよりも簡単に始められました。私はそれに満足しています。

インデクサーのオーバーヘッドを望まない場合は、grep/egrepをフォークしてください。

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

ボーナス:日付/タグ/などのような使用のファイル名の規則はgrepするファイルのセットを減らすために、テキストのボリュームがマルチメガバイトに行くならば、これは例えば、Perlでのみスキャンするよりもかなり高速になります。 find ... | xargs ...は、大きなアーカイブでヒットする可能性のあるワイルドカード拡張のシェルサイズ制限を回避するためのものです。

0

Lucene/Pluceneをお勧めする人がいます。 KinoSearchをチェックしてください。私はこれをCatalystベースのプロジェクトで1年以上使用しており、パフォーマンスとプログラミング/保守のし易さに非常に満足しています。

ご使用の環境でそのページの注意事項を考慮する必要がありますが、モジュールの安定性を証明できます。

関連する問題