a2cdc16d9e3dd645cfa9365162557ff06c9850a2
[angular-mojolicious.git] / trigger / KinoSearch.pm
1 use KinoSearch::Index::Indexer;
2 use KinoSearch::Plan::Schema;
3 use KinoSearch::Analysis::PolyAnalyzer;
4 use KinoSearch::Plan::FullTextType;
5
6 # Create a Schema which defines index fields.
7 my $schema = KinoSearch::Plan::Schema->new;
8 my $polyanalyzer = KinoSearch::Analysis::PolyAnalyzer->new( 
9         language => 'en',
10 );
11 my $type = KinoSearch::Plan::FullTextType->new(
12         analyzer => $polyanalyzer,
13 );
14 $schema->spec_field( name => '_id',   type => $type );
15 $schema->spec_field( name => '_rev', type => $type );
16
17 # Create the index and add documents.
18 our $indexer;
19
20
21 sub _indexer {
22         $indexer ||= KinoSearch::Index::Indexer->new(
23                 schema => $schema,   
24                 index  => '/tmp/index',
25                 create => 1,
26         );
27 };
28
29 use JSON;
30
31 sub flatten {
32         my ($flat,$data,$prefix) = @_;
33         if ( ref $data eq '' ) {
34                 $$flat->{$prefix} = $data;
35         } elsif ( ref $data eq 'HASH' ) {
36                 foreach my $key ( keys %$data ) {
37                         my $full_prefix = $prefix ? $prefix . '.' : '';
38                         $full_prefix .= $key;
39                         flatten( $flat, $data->{$key}, $full_prefix );
40                 }
41         } elsif ( ref $data eq 'ARRAY' ) {
42                 $$flat->{$prefix} = join("\n", map { ref $_ ? dump($_) : $_ } @$data);
43                 # FIXME arrays with non-scalar references aren't really indexed well
44         }
45 }
46
47 sub filter {
48         my $change = shift;
49         my $doc = $change->{doc} || next;
50         my $flat;
51         flatten( \$flat, $doc, '' );
52         foreach my $field ( keys %$flat ) {
53                 next if $schema->fetch_type($field);
54                 $schema->spec_field( name => $field, type => $type );
55                 warn "# +++ $field\n";
56         }
57         warn "# add_doc ",dump($flat);
58         _indexer->add_doc($flat);
59         return 0;
60 }
61
62 sub commit {
63         $indexer->commit;
64         undef $indexer;
65         warn "# commit index done";
66 }
67
68 1;