/[Grep]/lib/Grep/Search/KinoSearch.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /lib/Grep/Search/KinoSearch.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 141 by dpavlin, Tue May 8 12:37:28 2007 UTC revision 185 by dpavlin, Wed Apr 9 17:39:40 2008 UTC
# Line 3  package Grep::Search; Line 3  package Grep::Search;
3  use strict;  use strict;
4  use warnings;  use warnings;
5  use base qw( Class::Accessor );  use base qw( Class::Accessor );
6  Grep::Search->mk_accessors( qw( invindexer create index_path hits ) );  Grep::Search->mk_accessors( qw( create index_path hits ) );
7    
8  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
9  use KinoSearch::InvIndexer;  use KinoSearch::InvIndexer;
10  use KinoSearch::Searcher;  use KinoSearch::Searcher;
11  use Jifty::Util;  use Jifty::Util;
12    
13  my $debug = 0;  my $debug = 1;
14    
15  =head1 NAME  =head1 NAME
16    
# Line 22  Grep::Search - full text search using L< Line 22  Grep::Search - full text search using L<
22    
23    my $search = Grep::Search->new();    my $search = Grep::Search->new();
24    
25      my $search = Grep::Search->new( create => 1 );
26    
27  =cut  =cut
28    
29  sub log { Jifty->web->log }  sub log { Jifty->web->log }
# Line 34  sub new { Line 36  sub new {
36    
37          $self->index_path( $index_path );          $self->index_path( $index_path );
38    
39          if (! -e "$index_path") {          return $self;
40                  $self->log->debug("Creating new index $index_path");  }
41                  $self->invindexer( KinoSearch::InvIndexer->new( invindex => Grep::Search::Schema->clobber( $index_path ) ) );  
42    =head2 invindexer
43    
44    Accessor to call any method defined on L<KinoSearch::InvIndexer>
45    
46      $search->invindexer->delete_by_term( 'id', 42 );
47    
48    =cut
49    
50    my $indexes;
51    
52    sub invindexer {
53            my $self = shift;
54            my $invindexer;
55            my $index_path = $self->index_path or die "no index_path?";
56    
57            if ( $invindexer = $indexes->{$index_path} ) {
58                    $self->log->debug("Using cached index $index_path");
59          } else {          } else {
60                  $self->log->debug("Opening index: $index_path");                  if ( ! -e "$index_path" || $self->create ) {
61                  $self->invindexer( KinoSearch::InvIndexer->new( invindex => Grep::Search::Schema->open( $index_path ) ) );                          $self->log->debug("Creating new index $index_path");
62                            my $invindexer = KinoSearch::InvIndexer->new( invindex => Grep::Search::Schema->clobber( $index_path ) );
63                    } else {
64                            $self->log->debug("Opening index: $index_path");
65                            $invindexer = KinoSearch::InvIndexer->new( invindex => Grep::Search::Schema->open( $index_path ) );
66                    }
67                    $indexes->{$index_path} = $invindexer;
68          }          }
69    
70          return $self;          $self->invindexer( $invindexer );
71    
72  }  }
73    
74  =head2 add  =head2 add
# Line 95  sub add { Line 121  sub add {
121    
122                  next if (! defined($v) || $v eq '');                  next if (! defined($v) || $v eq '');
123    
124                  $v =~ s/<[^>]+>/ /gs;                  eval { $v =~ s/<[^>]+>/ /gs; };
125                    if ($@) {
126                            Jifty->log->error("can't strip html from $c in item ", $i->id);
127                            next;
128                    }
129    
130                  if ( defined( $pk->{$c} ) ) {                  if ( defined( $pk->{$c} ) ) {
131                          $doc->{ $c } = $v;                          $doc->{ $c } = $v;
# Line 113  sub add { Line 143  sub add {
143          $self->invindexer->add_doc( $doc );          $self->invindexer->add_doc( $doc );
144    
145          $self->log->debug("added ", $i->id, " for user $uid to index");          $self->log->debug("added ", $i->id, " for user $uid to index");
146    
147            return 1;
148  }  }
149    
150  =head2 collection  =head2 collection
# Line 138  sub collection { Line 170  sub collection {
170                  invindex => Grep::Search::Schema->open( $self->index_path ), );                  invindex => Grep::Search::Schema->open( $self->index_path ), );
171          $self->log->debug("$searcher created");          $self->log->debug("$searcher created");
172    
173          my $full_q = "($q) AND _owner_id:" . Jifty->web->current_user->id;          my $full_q = "($q)";
174    
175            my $uid = Jifty->web->current_user->id;
176            $full_q .= ' AND _owner_id:' . $uid if (defined $uid);
177    
178          $self->log->debug("searching for '$q' using $full_q");          $self->log->debug("searching for '$q' using $full_q");
179    
180            my $query_parser = KinoSearch::QueryParser->new(
181                    schema => Grep::Search::Schema->new,
182                    fields => [ qw/ title link content summary category author / ],
183            );
184            $query_parser->set_heed_colons(1);       # enable field:value AND/OR/NOT syntax
185            my $query = $query_parser->parse( $full_q );
186          my $hits = $searcher->search(          my $hits = $searcher->search(
187                  query           => $full_q,                  query           => $query,
188  #               offset          => $offset,  #               offset          => $offset,
189  #               num_wanted      => $hits_per_page,  #               num_wanted      => $hits_per_page,
190          );          );
# Line 156  sub collection { Line 198  sub collection {
198          my @results;          my @results;
199    
200          my $i = 0;          my $i = 0;
201          while ( my $hit = $hits->fetch_hit_hashref ) {          while ( my $hit = $hits->fetch_hit ) {
202    
203                  my $score = $hit->{score};                  my $score = $hit->{score};
204                  my $title = $hit->{title};                  my $title = $hit->{title};
205                  my $id = $hit->{id};                  my $id = $hit->{id};
206    
207                  $self->log->debug("result $i $score $title");                  $self->log->debug("result $i [$id] $title $score");
208    
209                  my $item = Grep::Model::Item->new();                  my $item = Grep::Model::Item->new();
210                  my ($ok,$msg) = $item->load_by_cols( id => $id );                  my ($ok,$msg) = $item->load_by_cols( id => $id );
# Line 197  sub finish { Line 239  sub finish {
239    
240          undef $self;          undef $self;
241    
242          return;          return 1;
243  }  }
244    
245  =head2 snippet  =head2 snippet
# Line 224  sub snippet { Line 266  sub snippet {
266  package Grep::Search::KeywordField;  package Grep::Search::KeywordField;
267  use base qw( KinoSearch::Schema::FieldSpec );  use base qw( KinoSearch::Schema::FieldSpec );
268  sub analyzed { 0 }  sub analyzed { 0 }
269    #sub indexed { 1 }
270    #sub stored { 1 }
271    sub vectorized { 0 }
272    
273  package Grep::Search::Schema;  package Grep::Search::Schema;
274    
# Line 251  our %fields = ( Line 296  our %fields = (
296          summary                 => 'KinoSearch::Schema::FieldSpec',          summary                 => 'KinoSearch::Schema::FieldSpec',
297          category                => 'KinoSearch::Schema::FieldSpec',          category                => 'KinoSearch::Schema::FieldSpec',
298          author                  => 'KinoSearch::Schema::FieldSpec',          author                  => 'KinoSearch::Schema::FieldSpec',
299          issued                  => 'Grep::Search::KeywordField',          created_on              => 'Grep::Search::KeywordField',
300          modified                => 'Grep::Search::KeywordField',          last_update             => 'Grep::Search::KeywordField',
301    
302          _owner_id               => 'Grep::Search::KeywordField',          _owner_id               => 'Grep::Search::KeywordField',
303  );  );

Legend:
Removed from v.141  
changed lines
  Added in v.185

  ViewVC Help
Powered by ViewVC 1.1.26