/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 192 - (hide annotations)
Fri May 23 21:52:06 2008 UTC (15 years, 11 months ago) by dpavlin
File size: 3937 byte(s)
and make them both work by (hopefully) rewriting queries
into back-end specific ones at right place
1 dpavlin 189 package Grep::Search::KinoSearch;
2 dpavlin 47
3     use strict;
4     use warnings;
5    
6     use Data::Dump qw/dump/;
7 dpavlin 127 use KinoSearch::InvIndexer;
8     use KinoSearch::Searcher;
9 dpavlin 47 use Jifty::Util;
10    
11 dpavlin 190 my $debug = 1;
12 dpavlin 47
13 dpavlin 109 =head1 NAME
14 dpavlin 47
15 dpavlin 189 Grep::Search::KinoSearch - full text search using L<KinoSearch>
16 dpavlin 47
17 dpavlin 109 =head1 METHODS
18 dpavlin 47
19 dpavlin 185 =head2 invindexer
20    
21     Accessor to call any method defined on L<KinoSearch::InvIndexer>
22    
23     $search->invindexer->delete_by_term( 'id', 42 );
24    
25     =cut
26    
27 dpavlin 189 our $indexes;
28 dpavlin 185
29     sub invindexer {
30     my $self = shift;
31     my $invindexer;
32 dpavlin 190 my $index_path = Jifty::Util->app_root . '/var/invindex';
33 dpavlin 185
34     if ( $invindexer = $indexes->{$index_path} ) {
35     $self->log->debug("Using cached index $index_path");
36 dpavlin 47 } else {
37 dpavlin 189 if ( $self->create || -e $index_path ) {
38 dpavlin 185 $self->log->debug("Creating new index $index_path");
39 dpavlin 189 $invindexer = KinoSearch::InvIndexer->new( invindex => Grep::Search::KinoSearch::Schema->clobber( $index_path ) )
40     or die "can't create index $index_path: $!";
41     $self->create( 0 );
42 dpavlin 185 } else {
43     $self->log->debug("Opening index: $index_path");
44 dpavlin 189 $invindexer = KinoSearch::InvIndexer->new( invindex => Grep::Search::KinoSearch::Schema->open( $index_path ) )
45     or die "can't open index $index_path: $!";
46 dpavlin 185 }
47     $indexes->{$index_path} = $invindexer;
48 dpavlin 47 }
49    
50 dpavlin 189 return $invindexer;
51 dpavlin 49 }
52    
53 dpavlin 47 =head2 add
54    
55 dpavlin 190 $search->add( $doc_hash );
56 dpavlin 47
57     =cut
58    
59     sub add {
60     my $self = shift;
61 dpavlin 190 my $doc = shift;
62 dpavlin 127 $self->invindexer->add_doc( $doc );
63 dpavlin 151 return 1;
64 dpavlin 47 }
65    
66 dpavlin 190 =head2 search
67 dpavlin 47
68 dpavlin 190 my $fetch_hit_coderef = $self->search('search query');
69 dpavlin 141
70 dpavlin 47 =cut
71    
72 dpavlin 190 sub search {
73 dpavlin 47 my $self = shift;
74    
75     my $q = shift or die "no q?";
76    
77 dpavlin 192 my $full_q = "($q)";
78     my $uid = Jifty->web->current_user->id;
79     $full_q .= ' AND _owner_id:' . $uid if (defined $uid);
80    
81 dpavlin 190 my $index_path = Jifty::Util->app_root . '/var/invindex';
82 dpavlin 127 my $searcher = KinoSearch::Searcher->new(
83 dpavlin 190 invindex => Grep::Search::KinoSearch::Schema->open( $index_path ), );
84 dpavlin 98 $self->log->debug("$searcher created");
85 dpavlin 47
86 dpavlin 127 $self->log->debug("searching for '$q' using $full_q");
87 dpavlin 153
88     my $query_parser = KinoSearch::QueryParser->new(
89 dpavlin 189 schema => Grep::Search::KinoSearch::Schema->new,
90 dpavlin 153 fields => [ qw/ title link content summary category author / ],
91     );
92     $query_parser->set_heed_colons(1); # enable field:value AND/OR/NOT syntax
93     my $query = $query_parser->parse( $full_q );
94 dpavlin 127 my $hits = $searcher->search(
95 dpavlin 153 query => $query,
96 dpavlin 127 # offset => $offset,
97     # num_wanted => $hits_per_page,
98     );
99 dpavlin 64
100 dpavlin 141 $self->hits( $hits->total_hits );
101 dpavlin 47
102 dpavlin 190 return sub {
103     return $hits->fetch_hit;
104     };
105 dpavlin 47 }
106    
107     =head2 finish
108    
109 dpavlin 109 $search->finish
110 dpavlin 47
111     =cut
112    
113     sub finish {
114     my $self = shift;
115 dpavlin 127 if ($self->invindexer) {
116 dpavlin 102 $self->log->debug("closing index");
117 dpavlin 127 $self->invindexer->finish;
118 dpavlin 47 }
119 dpavlin 58
120 dpavlin 110 $self->log->debug("finish");
121    
122 dpavlin 112 undef $self;
123    
124 dpavlin 151 return 1;
125 dpavlin 47 }
126    
127 dpavlin 189 package Grep::Search::KinoSearch::KeywordField;
128 dpavlin 127 use base qw( KinoSearch::Schema::FieldSpec );
129     sub analyzed { 0 }
130 dpavlin 153 #sub indexed { 1 }
131     #sub stored { 1 }
132     sub vectorized { 0 }
133 dpavlin 127
134 dpavlin 189 package Grep::Search::KinoSearch::Schema;
135 dpavlin 127
136     =head1 NAME
137    
138 dpavlin 189 Grep::Search::KinoSearch::Schema - schema definition for full-text search
139 dpavlin 127
140     =cut
141    
142     use base 'KinoSearch::Schema';
143     use KinoSearch::Analysis::PolyAnalyzer;
144    
145 dpavlin 131 our %fields = (
146 dpavlin 189 id => 'Grep::Search::KinoSearch::KeywordField',
147 dpavlin 127
148 dpavlin 189 in_feed_id => 'Grep::Search::KinoSearch::KeywordField',
149     in_feed_url => 'Grep::Search::KinoSearch::KeywordField',
150 dpavlin 127 in_feed_title => 'KinoSearch::Schema::FieldSpec',
151 dpavlin 189 in_feed_owner => 'Grep::Search::KinoSearch::KeywordField',
152     in_feed_created_on => 'Grep::Search::KinoSearch::KeywordField',
153 dpavlin 127
154     title => 'KinoSearch::Schema::FieldSpec',
155 dpavlin 189 link => 'Grep::Search::KinoSearch::KeywordField',
156 dpavlin 127 content => 'KinoSearch::Schema::FieldSpec',
157     summary => 'KinoSearch::Schema::FieldSpec',
158     category => 'KinoSearch::Schema::FieldSpec',
159     author => 'KinoSearch::Schema::FieldSpec',
160 dpavlin 189 created_on => 'Grep::Search::KinoSearch::KeywordField',
161     last_update => 'Grep::Search::KinoSearch::KeywordField',
162 dpavlin 127
163 dpavlin 189 _owner_id => 'Grep::Search::KinoSearch::KeywordField',
164 dpavlin 127 );
165    
166     sub analyzer {
167     return KinoSearch::Analysis::PolyAnalyzer->new( language => 'en' );
168     }
169    
170 dpavlin 47 1;

  ViewVC Help
Powered by ViewVC 1.1.26