1 use KinoSearch::Index::Indexer;
2 use KinoSearch::Plan::Schema;
3 use KinoSearch::Analysis::PolyAnalyzer;
4 use KinoSearch::Plan::FullTextType;
6 # Create a Schema which defines index fields.
7 my $schema = KinoSearch::Plan::Schema->new;
8 my $polyanalyzer = KinoSearch::Analysis::PolyAnalyzer->new(
11 my $type = KinoSearch::Plan::FullTextType->new(
12 analyzer => $polyanalyzer,
14 $schema->spec_field( name => '_id', type => $type );
15 $schema->spec_field( name => '_rev', type => $type );
17 # Create the index and add documents.
22 $indexer ||= KinoSearch::Index::Indexer->new(
24 index => '/tmp/index',
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 . '.' : '';
39 flatten( $flat, $data->{$key}, $full_prefix );
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
49 my $doc = $change->{doc} || next;
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";
57 warn "# add_doc ",dump($flat);
58 _indexer->add_doc($flat);
65 warn "# commit index done";