--- lib/Grep/Search.pm 2007/02/24 11:42:10 95 +++ lib/Grep/Search.pm 2007/03/14 18:46:37 109 @@ -2,57 +2,56 @@ use strict; use warnings; +use base qw( Class::Accessor Jifty::Object ); +Grep::Search->mk_accessors( qw( analyzer store writer create index_path ) ); use Data::Dump qw/dump/; use Lucene; use Jifty::Util; -my $index_path = Jifty::Util->app_root . '/var/lucene'; +my $debug = 0; -my ( $analyzer, $store, $writer ); +=head1 NAME -my $debug = 1; -my $create; +Grep::Search - full text search -sub create { +=head1 METHODS - if (defined( $create )) { - Jifty->log->debug("using previous create $create"); - return $create; - } +=head2 new + + my $search = Grep::Search->new(); + +=cut + +sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + + my $index_path = Jifty::Util->app_root . '/var/lucene'; + + $self->index_path( $index_path ); if (! -e "$index_path/segments") { - $create = 1; - Jifty->log->debug("create index $index_path"); + $self->create( 1 ); + $self->log->debug("Creating new index $index_path"); } else { - $create = 0; - Jifty->log->debug("open index: $index_path"); + $self->create( 0 ); + $self->log->debug("Opening index: $index_path"); } - return $create; -} -sub analyzer { - my $self = shift; - $analyzer ||= new Lucene::Analysis::Standard::StandardAnalyzer(); - return $analyzer; -} + $self->analyzer( new Lucene::Analysis::Standard::StandardAnalyzer() ); + $self->log->debug($self->analyzer . " created"); -sub store { - my $self = shift; + $self->store( Lucene::Store::FSDirectory->getDirectory( $index_path, $self->create ) ); + $self->log->debug($self->store, " created"); - $store ||= Lucene::Store::FSDirectory->getDirectory( $index_path, $self->create ); - return $store; + return $self; } -sub writer { - my $self = shift; - $writer ||= new Lucene::Index::IndexWriter( $self->store, $self->analyzer, $self->create ); - return $writer; -} =head2 add - Grep::Search->add( $record, $owner_id ); + $search->add( $record, $owner_id ); =cut @@ -115,14 +114,19 @@ $uid ||= Jifty->web->current_user->id; $doc->add(Lucene::Document::Field->Keyword( '_owner_id', $uid )); + if (! defined( $self->writer )) { + $self->writer( new Lucene::Index::IndexWriter( $self->store, $self->analyzer, $self->create ) ); + $self->log->debug($self->writer, " created"); + } + $self->writer->addDocument($doc); - Jifty->log->debug("added ", $i->id, " for user $uid to index"); + $self->log->debug("added ", $i->id, " for user $uid to index"); } -=head2 +=head2 collection - my $ItemCollection = Grep::Search->collection( 'search query' ); + my $ItemCollection = $search->collection( 'search query' ); =cut @@ -134,18 +138,20 @@ return if ( $self->create ); my $searcher = new Lucene::Search::IndexSearcher($self->store); + $self->log->debug("$searcher created"); my $parser = new Lucene::QueryParser("content", $self->analyzer); + $self->log->debug("$parser created"); my $full_q = "($q) AND _owner_id:" . Jifty->web->current_user->id; my $query = $parser->parse( $full_q ); - Jifty->log->debug("searching for '$q' using ", $query->toString); + $self->log->debug("searching for '$q' using ", $query->toString); my $hits = $searcher->search($query); my $num_hits = $hits->length(); - Jifty->log->debug("found $num_hits results"); + $self->log->debug("found $num_hits results"); my $collection = Grep::Model::ItemCollection->new(); @@ -159,7 +165,7 @@ my $title = $doc->get("title"); my $id = $doc->get("id"); - warn "## $i $score $title\n"; + $self->log->debug("result $i $score $title"); my $item = Grep::Model::Item->new(); my ($ok,$msg) = $item->load_by_cols( id => $id ); @@ -183,20 +189,21 @@ =head2 finish - Grep::Search->finish + $search->finish =cut sub finish { my $self = shift; - if ($writer) { - warn "closing index\n"; - $writer->close; + if ($self->writer) { + $self->log->debug("closing index"); + $self->writer->close; } - undef $writer; - undef $store; - undef $create; - undef $analyzer; + +# $self->writer( undef ); +# $self->store( undef ); +# $self->create( undef ); +# $self->analyzer( undef ); return; } @@ -220,7 +227,6 @@ my $short = $self->snippet( 50, $text ); - =cut sub snippet {