From 792c643ba76e8b06ae17d3653402d381f59857c2 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 23 May 2019 09:36:42 +0000 Subject: search: reenable phrase search on non-chert Xapian This is assuming nobody uses flint or earlier, anymore; as flint predates the existence of this project. --- lib/PublicInbox/Search.pm | 48 ++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) (limited to 'lib') 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); } -- cgit v1.2.3-24-ge0c7