root/trunk/plagger/lib/Plagger/Plugin/Search/Rast.pm

Revision 130 (checked in by ko, 15 years ago)

Added Search::Rast plugin

Line 
1 package Plagger::Plugin::Search::Rast;
2 use strict;
3 use base qw( Plagger::Plugin );
4
5 use Encode;
6 use POSIX;
7 use Rast;
8
9 sub register {
10     my($self, $context) = @_;
11     $context->register_hook(
12         $self,
13         'publish.feed' => \&feed,
14         'publish.finalize' => \&finalize,
15     );
16 }
17
18
19 sub init {
20     my($self) = @_;
21     $self->SUPER::init(@_);
22
23     my $dir = $self->conf->{dir};
24     $self->{encode} = $self->conf->{encode} || 'utf8';
25
26     unless (-e $dir && -d _) {
27         my $ret = Rast->create($dir, {
28             encoding => $self->{encode},
29             preserve_text => 1,
30             properties => [
31                    [
32                     'feedlink',
33                     RAST_TYPE_STRING,
34                     RAST_PROPERTY_FLAG_SEARCH | RAST_PROPERTY_FLAG_TEXT_SEARCH
35                     ],
36                    [
37                     'permalink',
38                     RAST_TYPE_STRING,
39                     RAST_PROPERTY_FLAG_SEARCH | RAST_PROPERTY_FLAG_TEXT_SEARCH
40                     ],
41                    [
42                     'title',
43                     RAST_TYPE_STRING,
44                     RAST_PROPERTY_FLAG_TEXT_SEARCH | RAST_PROPERTY_FLAG_FULL_TEXT_SEARCH
45                     ],
46                    [
47                     'author',
48                     RAST_TYPE_STRING,
49                     RAST_PROPERTY_FLAG_SEARCH | RAST_PROPERTY_FLAG_TEXT_SEARCH
50                     ],
51                    [
52                     'date',
53                     RAST_TYPE_DATE,
54                     RAST_PROPERTY_FLAG_SEARCH
55                     ],
56                    [
57                     'tags',
58                     RAST_TYPE_STRING,
59                     RAST_PROPERTY_FLAG_TEXT_SEARCH
60                     ]
61                    ],
62                 });
63         unless ($ret) {
64             Plagger->context->error("create index error $dir");
65             return;
66         }
67         Plagger->context->log(info => "create index $dir");
68     }
69
70     #euc_jp to euc-jp
71     $self->{encode} =~ s/_/-/;
72     $self->{rast} = Rast->open($dir, RAST_DB_RDWR);
73 }
74
75 sub feed {
76     my($self, $context, $args) = @_;
77  
78     my $rast = $self->{rast};
79     return unless $rast;
80     my $dir = $self->conf->{dir};
81
82     my $feed = $args->{feed};
83     for my $entry ($feed->entries) {
84         next unless $entry->text;
85
86         my $result = $rast->search('feedlink = ' . $feed->link . ' & permalink = ' . $entry->permalink, {
87             need_summary => 1,
88             properties => ['permalink']
89             });
90         unless ($result) {
91             $context->error('search error ' . $entry->permalink);
92             return;
93         }
94
95         my $tags;
96         my $time = eval { $entry->date->epoch } || time;
97         my $options = [
98                         $feed->link,
99                         $entry->permalink,
100                         $self->convert($entry->title) || '',
101                         $self->convert($entry->author) || '',
102                         POSIX::strftime('%Y-%m-%dT%H:%M:%S', localtime($time)),
103                         $self->convert(join(' ', @{ $entry->tags }))
104                         ];
105
106         my $text = $self->convert($entry->text);
107         unless ($result->hit_count) {
108             my $id = $rast->register($text, $options);
109             $context->log(info => "add new docid = $id: " . $entry->permalink);
110         } elsif ($self->conf->{replace}) {
111             my $row = $result->fetch;
112             my $id = $rast->update($text, $options, $row->{doc_id});
113             $context->log(info => "replace: old docid = " . $row->{doc_id} . " to new docid = $id: " . $entry->permalink);
114         }
115     }
116 }
117
118 sub convert {
119     my ($self, $str) = @_;
120     $str = encode($self->{encode}, $str) unless $self->{encode} eq 'utf8';
121     $str;
122 }
123
124 sub finalize {
125     my($self, $context) = @_;
126     return unless $self->{rast};
127     $self->{rast}->close;
128 }
129
130 1;
131
132 __END__
133
134 =head1 NAME
135
136 Plagger::Plugin::Search::Rast - Search Feed updates by Rast
137
138 =head1 SYNOPSIS
139
140   - module: Search::Rast
141     config:
142       encode: euc_jp
143       replace: 1
144       dir: /home/yappo/plagger-rast
145
146 =head1 DESCRIPTION
147
148 This plugin can be indexed via Rast. please use the rast-search command to search.
149
150 =head1 AUTHOR
151
152 Kazuhiro Osawa
153
154 =head1 SEE ALSO
155
156 L<Plagger>, L<http://projects.netlab.jp/rast/>, L<http://tech.yappo.jp/rast/>
157
158 =cut
Note: See TracBrowser for help on using the browser.