1

Perl Pluceneモジュールをいじくり回して、インデックスを作成したので、今はそれを検索して結果を返そうとしています。

インデックスを作成するための私のコードはここにあります...これをスキップして読むことができる可能性があります:

#usr/bin/perl
use Plucene::Document;
use Plucene::Document::Field;
use Plucene::Index::Writer;
use Plucene::Analysis::SimpleAnalyzer;
use Plucene::Search::HitCollector;
use Plucene::Search::IndexSearcher;
use Plucene::QueryParser;
use Try::Tiny;
my $content = $ARGV[0];
my $doc = Plucene::Document->new;
my $i=0;
$doc->add(Plucene::Document::Field->Text(content => $content));
my $analyzer = Plucene::Analysis::SimpleAnalyzer->new();

if (!(-d "solutions" )) {
        $i = 1;
}

if ($i)
{
    my $writer = Plucene::Index::Writer->new("solutions", $analyzer, 1); #Third param is 1 if creating new index, 0 if adding to existing
    $writer->add_document($doc);
    my $doc_count = $writer->doc_count;
    undef $writer; # close
}
else
{
    my $writer = Plucene::Index::Writer->new("solutions", $analyzer, 0);
    $writer->add_document($doc);
    my $doc_count = $writer->doc_count;
    undef $writer; # close
}

「solutions」というフォルダとそれにさまざまなファイルが作成されます...作成したドキュメントのインデックス付きファイルを想定しています。インデックスを検索したいのですが、何も思いつきません。これが私の試みであり、Plucene::CPANの簡単な例に導かれています。これは、コマンドラインからパラメータ「lol」を使用して上記を実行した後です。

#usr/bin/perl  

  use Plucene::Simple;

  my $plucy = Plucene::Simple->open("solutions");
  my @ids = $plucy->search("content : lol"); 
  foreach(@ids)
  {
    print $_;
  }

悲しいことに、何も印刷されません)-=。インデックスのクエリは単純なはずですが、おそらく私自身の愚かさがこれを行う能力を制限しているのでしょう。

4

1 に答える 1

3

私が時間内に発見した3つのこと:

  • Pluceneは非常に非効率的な概念実証であり、LuceneのJava実装は、このツールを使用する場合の道のりです。ここにいくつかの証拠があります:http ://www.kinosearch.com/kinosearch/benchmarks.html
  • ルーシーは、同じことを行い、より多くのドキュメントとコミュニティを持っている優れた選択肢です(質問へのコメントによる)。
  • この問題で私が尋ねたことを行う方法。

2つのスクリプトを共有します。1つはファイルを新しいPluceneインデックスにインポートするためのもので、もう1つはそのインデックスを検索して取得するためのものです。Pluceneの真に実用的な例...インターネット上で簡単に見つけることはできません。また、私はこれらのモジュールをCPANするのに非常に苦労しました...それで私はCPANサイト(Googleだけ)に行き、tarを取得して自分のPerlライブラリ(私はStrawberry Perl、Windows 7を使用しています)に入れました、しかし無計画。それから私はそれらを実行して、それが要求したすべての依存関係をCPANしようとしました。これは物事を行うためのずさんな方法です...しかし、それは私がそれらをした方法であり、今ではうまくいきます。

#usr/bin/perl
use strict;
use warnings;
use Plucene::Simple;
my $content_1 = $ARGV[0];
my $content_2 = $ARGV[1];
my %documents;

 %documents = (
"".$content_2 => { 

                     content => $content_1
                   }
);

print $content_1;
my $index = Plucene::Simple->open( "solutions" );
for my $id (keys %documents) 
{
        $index->add($id => $documents{$id});
}
 $index->optimize;

それで、これは何をしますか...あなたはあなたが選んだ2つのコマンドライン引数でスクリプトを呼び出します-それは「2番目の引数」=>「最初の引数」の形式のキーと値のペアを作成します。これは、apacheサイト(http://lucene.apache.org/solr/api/doc-files/tutorial.html)のチュートリアルのXMLのように考えてください。2番目の引数はフィールド名です。

とにかく、これにより、スクリプトが実行されたディレクトリにフォルダが作成されます-そのフォルダには、luceneによって作成されたファイルが作成されます-これはあなたのインデックスです!! ここで行う必要があるのは、Pluceneによって簡単にできるLuceneの力を使用してそのインデックスを検索することだけです。スクリプトは次のとおりです。

#usr/bin/perl  
use strict;
use warnings;
use Plucene::Simple;
my $content_1 = $ARGV[0];
my $index = Plucene::Simple->open( "solutions" );


my (@ids, $error);
my $query = $content_1;
@ids = $index->search($query);
foreach(@ids)
{
    print $_."---seperator---";
}

このスクリプトは、コマンドラインから1つの引数を指定して呼び出すことで実行します。たとえば、前のスクリプトを呼び出したときと同じ最初の引数にします。これを行うと、前の例の2番目の引数が出力されることがわかります。つまり、その値を取得しました。また、同じ値を持つ他のキーと値のペアがある場合、これもそれらを出力します。それらの間に「---seperator---」があります!

于 2012-06-28T13:03:16.893 に答える