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

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

changed work for encode.

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} eq 'euc_jp' ? 'euc_jp' : '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     $self->{rast} = Rast->open($dir, RAST_DB_RDWR);
70 }
71
72 sub feed {
73     my($self, $context, $args) = @_;
74  
75     my $rast = $self->{rast};
76     return unless $rast;
77     my $dir = $self->conf->{dir};
78
79     my $feed = $args->{feed};
80     for my $entry ($feed->entries) {
81         next unless $entry->text;
82
83         my $result = $rast->search('feedlink = ' . $feed->link . ' & permalink = ' . $entry->permalink, {
84             need_summary => 1,
85             properties => ['permalink']
86             });
87         unless ($result) {
88             $context->error('search error ' . $entry->permalink);
89             return;
90         }
91
92         my $tags;
93         my $time = eval { $entry->date->epoch } || time;
94         my $options = [
95                         $feed->link,
96                         $entry->permalink,
97                         $self->convert($entry->title) || '',
98                         $self->convert($entry->author) || '',
99                         POSIX::strftime('%Y-%m-%dT%H:%M:%S', localtime($time)),
100                         $self->convert(join(' ', @{ $entry->tags }))
101                         ];
102
103         my $text = $self->convert($entry->text);
104         unless ($result->hit_count) {
105             my $id = $rast->register($text, $options);
106             $context->log(info => "add new docid = $id: " . $entry->permalink);
107         } elsif ($self->conf->{replace}) {
108             my $row = $result->fetch;
109             my $id = $rast->update($text, $options, $row->{doc_id});
110             $context->log(info => "replace: old docid = " . $row->{doc_id} . " to new docid = $id: " . $entry->permalink);
111         }
112     }
113 }
114
115 sub convert {
116     my ($self, $str) = @_;
117     utf8::decode($str) unless utf8::is_utf8($str);
118     return encode($self->{encode}, $str);
119 }
120
121 sub finalize {
122     my($self, $context) = @_;
123     return unless $self->{rast};
124     $self->{rast}->close;
125 }
126
127 1;
128
129 __END__
130
131 =head1 NAME
132
133 Plagger::Plugin::Search::Rast - Search Feed updates by Rast
134
135 =head1 SYNOPSIS
136
137   - module: Search::Rast
138     config:
139       encode: euc_jp
140       replace: 1
141       dir: /home/yappo/plagger-rast
142
143 =head1 DESCRIPTION
144
145 This plugin can be indexed via Rast. please use the rast-search command to search.
146
147 =head1 AUTHOR
148
149 Kazuhiro Osawa
150
151 =head1 SEE ALSO
152
153 L<Plagger>, L<http://projects.netlab.jp/rast/>, L<http://tech.yappo.jp/rast/>
154
155 =cut
Note: See TracBrowser for help on using the browser.