QueryParser Driver: Improve anchored searches
authorThomas Berezansky <tsbere@mvlc.org>
Wed, 12 Sep 2012 13:12:41 +0000 (09:12 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Fri, 15 Feb 2013 20:39:48 +0000 (15:39 -0500)
By checking individual atoms for ^ and $ anchors we can get better results,
without needing to have people quote individual terms.

Signed-off-by: Thomas Berezansky <tsbere@mvlc.org>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm

index c0e345b..358972e 100644 (file)
@@ -827,7 +827,7 @@ sub rel_bump {
     my $bump = shift;
     my $multiplier = shift;
 
-    my $only_atoms = $node->only_atoms;
+    my $only_atoms = $node->only_real_atoms;
     return '' if (!@$only_atoms);
 
     if ($bump eq 'first_word') {
@@ -922,6 +922,10 @@ sub flatten {
                 $where .= '(' . $talias . ".id IS NOT NULL";
                 $where .= ' AND ' . join(' AND ', map {"${talias}.value ~* ".$self->QueryParser->quote_phrase_value($_)} @{$node->phrases}) if (@{$node->phrases});
                 $where .= ' AND ' . join(' AND ', map {"${talias}.value !~* ".$self->QueryParser->quote_phrase_value($_)} @{$node->unphrases}) if (@{$node->unphrases});
+                for my $atom (@{$node->only_real_atoms}) {
+                    next unless $atom->{content} && $atom->{content} =~ /(^\^|\$$)/;
+                    $where .= " AND ${talias}.value ~* ".$self->QueryParser->quote_phrase_value($atom->{content});
+                }
                 $where .= ')';
 
                 push @rank_list, $node_rank;
@@ -1230,6 +1234,18 @@ sub only_atoms {
     return \@only_atoms;
 }
 
+sub only_real_atoms {
+    my $self = shift;
+
+    my $atoms = $self->query_atoms;
+    my @only_real_atoms;
+    for my $a (@$atoms) {
+        push(@only_real_atoms, $a) if (ref($a) && $a->isa('QueryParser::query_plan::node::atom') && !($a->{dummy}));
+    }
+
+    return \@only_real_atoms;
+}
+
 sub dummy_count {
     my $self = shift;
     return $self->{dummy_count};