2012-06-27 4 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 
} 

그것은 그것에 "솔루션"및 다양한 파일이라는 폴더를 만듭니다 내가 만든 문서의 색인 파일을 가정합니다. 이제 색인을 검색하고 싶습니다 ... 그러나 나는 아무 것도 생각 나지 않습니다. 다음은 Plucene :: CPAN의 간단한 예제에 의해 유도 된 나의 시도입니다. 이것은 위의 명령 행에서 매개 변수 "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ée KinoSearch)는 Plucene보다 훨씬 더 나은 선택입니다. 50 배 빠르며 반응이 빠른 개발자와 훌륭한 커뮤니티가 활발하게 개발되고 있습니다. – Ashley

답변

3

세 가지 :

  • Plucene가 심하게 비효율적 인 개념 증명하고 루씬의 Java 구현 BY FAR이 도구를 사용하려고하면 갈 수있는 방법입니다. 여기에 약간의 증거가 있습니다 : http://www.kinosearch.com/kinosearch/benchmarks.html
  • 루시는 동일한 일을하고 더 많은 문서와 커뮤니티를 가지고 있습니다 (질문에 대한 의견대로).
  • 이 문제에서 내가 요청한 것을 수행하는 방법.

파일을 새 Plucene 색인으로 가져 오는 방법과 색인을 검색하여 검색하는 두 가지 스크립트를 공유합니다. Plucene의 실용적인 예는 인터넷에서 쉽게 찾을 수 없습니다. 또한, 나는이 모듈을 CPANing하는 데 엄청난 어려움을 겪었습니다 ... 그래서 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과 같이 생각해보십시오. 두 번째 인수는 필드 이름입니다.

Anywhere는 스크립트가 실행 된 디렉토리에 폴더를 만듭니다.이 폴더는 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---"; 
} 

는 하나 개의 인수를 명령 줄에서 호출하여이 스크립트를 실행 - 예를 위해서 이전 스크립트를 전화로이 같은 첫 번째 인수 할 수 있습니다. 그렇게하면 앞의 예제에서 두 번째 인수가 출력되는 것을 볼 수 있습니다! 그래서 당신은 그 가치를 얻었습니다! 그리고 같은 값을 가진 다른 키 - 값 쌍이 있다면, 그것도 역시 출력 할 것입니다! 그들 사이에 "--- seperator ---"가 있습니다!