optional case-insensitivity for searching
[bse.git] / site / cgi-bin / modules / BSE / Index / BSE.pm
index 0de5005..7958644 100644 (file)
@@ -2,9 +2,10 @@ package BSE::Index::BSE;
 use strict;
 use base 'BSE::Index::Base';
 use BSE::DB;
-use Constants qw($DATADIR $MAXPHRASE);
+use Constants qw($MAXPHRASE);
+use BSE::CfgInfo qw(cfg_data_dir);
 
-our $VERSION = "1.001";
+our $VERSION = "1.004";
 
 sub new {
   my ($class, %opts) = @_;
@@ -17,12 +18,16 @@ sub new {
   $self->{insertIndex} = $self->{dh}->stmt('insertIndex')
     or die "No insertIndex member in BSE::DB";
 
+  $self->{case} eq 'controlled'
+    and die "BSE built-in searcher doesn't support controlled search (yet)";
+
   my $priority = $self->{cfg}->entry("search", "index_priority", "speed");
   if ($priority eq "speed") {
     $self->{index} = {};
   }
   elsif ($priority eq "memory") {
-    require DBM::Deep;
+    eval { require DBM::Deep; 1 }
+      or die "DBM::Deep must be installed to use [search].index_priority=memory\n";
     require File::Temp;
     my $fh = File::Temp->new;
     $self->{index} = DBM::Deep->new
@@ -50,7 +55,8 @@ sub new {
 sub start_index {
   my $self = shift;
 
-  my $stopwords = "$DATADIR/stopwords.txt";
+  my $data_dir = cfg_data_dir();
+  my $stopwords = "$data_dir/stopwords.txt";
 
   # load the stop words
   open STOP, "< $stopwords"
@@ -111,17 +117,22 @@ sub process {
     $end = $#words if $end > $#words;
     
     for my $phrase (map { "@words[$start..$_]" } $start..$end) {
-      if (lc $phrase ne $phrase && !$seen->{lc $phrase}++) {
-       my $temp = $self->{index}{lc $phrase};
-       if (exists $temp->{$id}) {
-         $weights->{lc $phrase} *= $self->{decay_multiplier};
-         $temp->{$id}[1] += $score * $weights->{lc $phrase};
-       }
-       else {
-         $weights->{lc $phrase} = 1.0;
-         $temp->{$id} = [ $sectionid, $score ];
+      if ($self->{case} eq 'context') {
+       if (lc $phrase ne $phrase && !$seen->{lc $phrase}++) {
+         my $temp = $self->{index}{lc $phrase};
+         if (exists $temp->{$id}) {
+           $weights->{lc $phrase} *= $self->{decay_multiplier};
+           $temp->{$id}[1] += $score * $weights->{lc $phrase};
+         }
+         else {
+           $weights->{lc $phrase} = 1.0;
+           $temp->{$id} = [ $sectionid, $score ];
+         }
+         $self->{index}{lc $phrase} = $temp;
        }
-       $self->{index}{lc $phrase} = $temp;
+      }
+      else {
+       $phrase = lc $phrase;
       }
       if (!$seen->{$phrase}++) {
        my $temp = $self->{index}{$phrase};