about summary refs log tree commit homepage
path: root/lib/PublicInbox/Search.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-05-23 09:36:42 +0000
committerEric Wong <e@80x24.org>2019-05-23 17:43:50 +0000
commit792c643ba76e8b06ae17d3653402d381f59857c2 (patch)
tree8e5d77ca92b4fd4589cf06b1bfbe4804d3de6a72 /lib/PublicInbox/Search.pm
parentd2de7f85982da35d2e8a6fda48784946f6443f65 (diff)
downloadpublic-inbox-792c643ba76e8b06ae17d3653402d381f59857c2.tar.gz
This is assuming nobody uses flint or earlier, anymore;
as flint predates the existence of this project.
Diffstat (limited to 'lib/PublicInbox/Search.pm')
-rw-r--r--lib/PublicInbox/Search.pm48
1 files changed, 29 insertions, 19 deletions
diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm
index eae10d8e..d861cf47 100644
--- a/lib/PublicInbox/Search.pm
+++ b/lib/PublicInbox/Search.pm
@@ -24,8 +24,8 @@ sub load_xapian () {
 
                 # n.b. FLAG_PURE_NOT is expensive not suitable for a public
                 # website as it could become a denial-of-service vector
-                # FLAG_PHRASE also seems to cause performance problems
-                # sometimes.
+                # FLAG_PHRASE also seems to cause performance problems chert
+                # (and probably earlier Xapian DBs).  glass seems fine...
                 # TODO: make this an option, maybe?
                 # or make indexlevel=medium as default
                 FLAG_PHRASE()|FLAG_BOOLEAN()|FLAG_LOVEHATE()|FLAG_WILDCARD();
@@ -137,26 +137,35 @@ sub xdir ($;$) {
         }
 }
 
+sub _xdb ($) {
+        my ($self) = @_;
+        my $dir = xdir($self, 1);
+        my ($xdb, $slow_phrase);
+        my $qpf = \($self->{qp_flags} ||= $QP_FLAGS);
+        if ($self->{version} >= 2) {
+                foreach my $part (<$dir/*>) {
+                        -d $part && $part =~ m!/\d+\z! or next;
+                        my $sub = Search::Xapian::Database->new($part);
+                        if ($xdb) {
+                                $xdb->add_database($sub);
+                        } else {
+                                $xdb = $sub;
+                        }
+                        $slow_phrase ||= -f "$part/iamchert";
+                }
+        } else {
+                $slow_phrase = -f "$dir/iamchert";
+                $xdb = Search::Xapian::Database->new($dir);
+        }
+        $$qpf |= FLAG_PHRASE() unless $slow_phrase;
+        $xdb;
+}
+
 sub xdb ($) {
         my ($self) = @_;
         $self->{xdb} ||= do {
                 load_xapian();
-                my $dir = xdir($self, 1);
-                if ($self->{version} >= 2) {
-                        my $xdb;
-                        foreach my $part (<$dir/*>) {
-                                -d $part && $part =~ m!/\d+\z! or next;
-                                my $sub = Search::Xapian::Database->new($part);
-                                if ($xdb) {
-                                        $xdb->add_database($sub);
-                                } else {
-                                        $xdb = $sub;
-                                }
-                        }
-                        $xdb;
-                } else {
-                        Search::Xapian::Database->new($dir);
-                }
+                _xdb($self);
         };
 }
 
@@ -194,7 +203,8 @@ sub query {
                 $self->{over_ro}->recent($opts);
         } else {
                 my $qp = qp($self);
-                my $query = $qp->parse_query($query_string, $QP_FLAGS);
+                my $qp_flags = $self->{qp_flags};
+                my $query = $qp->parse_query($query_string, $qp_flags);
                 $opts->{relevance} = 1 unless exists $opts->{relevance};
                 _do_enquire($self, $query, $opts);
         }