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
}

它创建了一个名为“解决方案”的文件夹和各种文件......我假设我创建的文档的索引文件。现在我想搜索我的索引......但我没有想出任何东西。这是我的尝试,由 Plucene::Simple examples of 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

我及时发现了三件事:

  • Plucene 是一个非常低效的概念证明,如果您要使用这个工具,Lucene 的 Java 实现是 BY FAR 的最佳选择。这是一些证据:http ://www.kinosearch.com/kinosearch/benchmarks.html
  • Lucy 是一个更好的选择,它做同样的事情并且拥有更多的文档和社区(根据对问题的评论)。
  • 如何做我在这个问题中提出的问题。

我将分享两个脚本 - 一个用于将文件导入新的 Plucene 索引,另一个用于搜索该索引并检索它。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;

那么这是做什么的......你用你选择的两个命令行参数调用脚本 - 它创建一个“第二个参数”=>“第一个参数”形式的键值对。将其视为 apache 站点 (http://lucene.apache.org/solr/api/doc-files/tutorial.html) 上教程中的 XML。第二个参数是字段名。

任何人,这将在脚本运行的目录中创建一个文件夹 - 在该文件夹中将是由 lucene 创建的文件 - 这是你的索引!我们现在需要做的就是使用 Lucene 的强大功能搜索该索引,而 Plucene 使这一切变得容易。脚本如下:

#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---";
}

您可以通过使用 ONE 参数从命令行调用它来运行此脚本 - 例如,让它与您调用前一个脚本的第一个参数相同。如果你这样做,你会看到它打印了之前示例中的第二个参数!所以你已经取回了那个值!并且鉴于您有其他具有相同值的键值对,这也会打印它们!他们之间有“---分隔符---”!

于 2012-06-28T13:03:16.893 回答