--- lib/Grep/Search.pm 2007/02/21 19:31:26 60 +++ lib/Grep/Search.pm 2007/03/14 21:10:53 112 @@ -2,57 +2,57 @@ use strict; use warnings; +use base qw( Class::Accessor ); +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 log { Jifty->web->log } + +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; -} -sub store { - my $self = shift; + $self->analyzer( new Lucene::Analysis::Standard::StandardAnalyzer() ); + $self->log->debug($self->analyzer . " created"); - $store ||= Lucene::Store::FSDirectory->getDirectory( $index_path, $self->create ); - return $store; -} + $self->store( Lucene::Store::FSDirectory->getDirectory( $index_path, $self->create ) ); + $self->log->debug($self->store, " created"); -sub writer { - my $self = shift; - $writer ||= new Lucene::Index::IndexWriter( $self->store, $self->analyzer, $self->create ); - return $writer; + return $self; } =head2 add - Grep::Search->add( $record ); + $search->add( $record, $owner_id ); =cut @@ -60,6 +60,7 @@ my $self = shift; my $i = shift or die "no record to add"; + my $uid = shift; die "record not Jifty::Record but ", ref $i unless ($i->isa('Jifty::Record')); @@ -110,14 +111,23 @@ } } + # add _owner_id to speed up filtering of search results + $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, " 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 @@ -129,15 +139,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); - my $query = $parser->parse( $q ); + $self->log->debug("$parser created"); - Jifty->log->debug("searching for '$q' using ", $query->toString); + my $full_q = "($q) AND _owner_id:" . Jifty->web->current_user->id; + + my $query = $parser->parse( $full_q ); + + $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(); @@ -151,7 +166,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 ); @@ -167,6 +182,7 @@ undef $hits; undef $query; undef $parser; + $searcher->close; undef $searcher; return $collection; @@ -174,18 +190,20 @@ =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 $create; + + $self->log->debug("finish"); + + undef $self; return; } @@ -209,7 +227,6 @@ my $short = $self->snippet( 50, $text ); - =cut sub snippet {