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 my $blob_type = KinoSearch::Plan::BlobType->new( stored => 1 );
15 my $string_type = KinoSearch::Plan::StringType->new;
16 $schema->spec_field( name => '_id', type => $string_type );
17 $schema->spec_field( name => '_rev', type => $string_type );
18 $schema->spec_field( name => 'doc', type => $blob_type );
20 # Create the index and add documents.
25 $indexer ||= KinoSearch::Index::Indexer->new(
27 index => "/tmp/kinosearch.$database",
33 my ($flat,$data,$prefix) = @_;
34 if ( ref $data eq '' ) {
35 $$flat->{$prefix} .= "\n" . $data;
36 $$flat->{$prefix} =~ s/^\n//; # strip first
37 } elsif ( ref $data eq 'HASH' ) {
38 foreach my $key ( keys %$data ) {
39 my $full_prefix = $prefix ? $prefix . '.' : '';
41 flatten( $flat, $data->{$key}, $full_prefix );
43 } elsif ( ref $data eq 'ARRAY' ) {
44 foreach my $el ( @$data ) {
45 flatten( $flat, $el, $prefix );
47 } elsif ( ref $data eq 'Mojo::JSON::_Bool' ) {
48 $$flat->{$prefix} = $data;
50 die "unsupported ",ref($data)," from ",dump($data);
56 my $doc = $change->{doc} || next;
58 _indexer->delete_by_term( field => '_id', term => $doc->{_id} );
59 return 0 if $doc->{_deleted};
62 flatten( \$flat, $doc, '' );
63 foreach my $field ( keys %$flat ) {
64 next if $schema->fetch_type($field);
65 $schema->spec_field( name => $field, type => $type );
66 warn "# +++ $field\n";
68 $flat->{doc} = $json->encode($doc);
69 warn "# add_doc ",dump($flat);
70 _indexer->add_doc($flat);
75 return unless $indexer;
78 warn "# commit index done\n";