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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26