2012-06-27 43 views
1

用Perl Plucene模塊搞鬼更多,並創建了我的索引,現在我正在嘗試搜索並返回結果。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 
} 

它創建了一個名爲「解決方案」和各種文件,它的文件夾...我m假設我創建的文檔的索引文件。現在我想搜索我的索引...但我沒有提出任何事情。這是我的嘗試,由Plucene :: CPAN的簡單例子指導。這是在我從命令行用param「lol」運行上面的代碼之後。

#usr/bin/perl 

    use Plucene::Simple; 

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

什麼都不打印,可悲) - =。我覺得查詢索引應該很簡單,但也許我自己的愚蠢限制了我做這件事的能力。

+2

我在前面的主題中提到了這一點,但它重複。 [Lucy](http://metacpan.org/module/Lucy)(néeKinoSearch)是比Plucene更好的選擇。它的速度提高了50倍,並且積極開發具有高度響應的開發人員和體面的社區。 – Ashley

回答

3

三件事我及時發現:

  • Plucene是一個非常低效的驗證的概念和Java實現的Lucene是迄今爲止去,如果你要使用這個工具的方式。這裏是一些證明:http://www.kinosearch.com/kinosearch/benchmarks.html
  • 露西是一個優越的選擇,做同樣的事情,並有更多的文件和社區(根據問題的評論)。
  • 如何做到我在這個問題中提出的問題。

我將共享兩個腳本 - 一個用於將文件導入到新的Plucene索引,另一個用於搜索該索引並檢索它。一個真正的Plucene工作例子...在互聯網上找不到它。另外,我對這些模塊CPAN有很大的麻煩......所以我最終去了CPAN站點(只是谷歌),把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站點教程中的XML一樣(http://lucene.apache.org/solr/api/doc-files/tutorial.html)。第二個參數是字段名稱。

Anywho,這將使腳本運行的目錄中的文件夾 - 在該文件夾中將由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---"; 
} 

您用一個參數從命令行調用它運行此腳本 - 例如的緣故,讓它成爲同第一個參數叫你前面的腳本。如果你這樣做,你會看到它從之前的例子中打印出你的第二個參數!所以你已經檢索了這個值!並且,假設您有其他具有相同值的鍵值對,這也會打印出來!與他們之間的「---分隔符---」!