- my $null_d = $descriptions[$i];
- $null_d =~ s/\n/\000/g;
- print DESCR "$null_d\n";
- $descriptions_db{$i} = $descriptions[$i];
+ my $plain_description = $descriptions[$i];
+ # strip away additional data
+ my ($only_desc) = split /\000/o, $plain_description, 2;
+# WARNING: This needs to correspond with what happens in
+# Packages/Search.pm:do_fulltext_search
+ $plain_description =~ tr [A-Z] [a-z];
+ # ensure one space on both ends
+ $plain_description = " $plain_description ";
+ $plain_description =~ s/[(),.-]+//og;
+ $plain_description =~ s#[^a-z0-9_/+]+# #og;
+ print DESCR "$plain_description\n";
+
+ #XAPIAN
+ eval {
+ my @words = split /\s+/, $plain_description;
+ my $stem_words = $stemmer->stem( \@words );
+ my $doc = Search::Xapian::Document->new()
+ or die "can't create doc object for $i: $!\n";
+ if ($doc->set_data($i)){
+ warn "can't set_data in doc object for $i: $!\n";
+ }
+ for my $j (0 .. (@$stem_words-1)) {
+ next if $stem_words->[$j] =~ /^\s*$/o;
+ if ($doc->add_posting($stem_words->[$j], $j)) {
+ warn "can't add word $stem_words->[$j] $j: $!\n";
+ }
+ }
+ $xapian_db->add_document($doc)
+ or warn "failed to add document: $i\n";
+ };
+ die $@ if $@;
+
+ $descriptions_db{$i} = $only_desc;