From 8c0d9bea5feb73259f27693d20a07d90d751735b Mon Sep 17 00:00:00 2001 From: Gilles Crettenand Date: Fri, 19 Jun 2015 09:41:26 +0200 Subject: [PATCH] use filter-query for visible to speed things up --- Lib/Search/BookSearch.php | 20 +++++++++++++++++--- NetBiblio.php | 8 ++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Lib/Search/BookSearch.php b/Lib/Search/BookSearch.php index 8b12ed8..67b829b 100644 --- a/Lib/Search/BookSearch.php +++ b/Lib/Search/BookSearch.php @@ -13,7 +13,10 @@ class BookSearch private $client; /** @var \SolrQuery */ private $query; + /** @var array parts of the query, parameter 'q' */ private $queryParts = array(); + /** @var array parts of the filter query, parameter 'fq' */ + private $filterQueryParts = array(); public function __construct($edismax = true) { @@ -79,12 +82,20 @@ class BookSearch } if (strlen($queryField) > 0) { - $queryText = "$queryField:\"$queryText\""; + $queryText = sprintf('%s:"%s"', $queryField, $queryText); } $this->queryParts[] = $queryText; } + public function addFilterQuery($text, $field, $escape = true) + { + if($escape) { + $text = \SolrUtils::escapeQueryChars($text); + } + $this->filterQueryParts[] = sprintf('%s:"%s"', $field, $text); + } + public function addRange($field, $min = '*', $max = '*') { $this->queryParts[] = sprintf('%s:[%s TO %s]', $field, $min, $max); @@ -136,6 +147,9 @@ class BookSearch else { $query = implode(' AND ', $this->queryParts); } + foreach($this->filterQueryParts as $fq) { + $this->query->addFilterQuery($fq); + } $this->query->setQuery($query); $this->query->setStart($start); $this->query->setRows($count); @@ -279,7 +293,7 @@ class BookSearch public static function GetTerms($field) { $s = new BookSearch(); - $s->addQuery(1, 'visible'); + $s->addFilterQuery(1, 'visible'); $s->addFacetField($field); $s->setFacetLimits(2000, 10); $results = $s->getResults(0, 0); @@ -290,7 +304,7 @@ class BookSearch public static function GetTermsRange($field) { $s = new BookSearch(); - $s->addQuery(1, 'visible'); + $s->addFilterQuery(1, 'visible'); $s->setFacetRangeField($field); $s->setFacetRange(0, 250, 1); // to avoid useless calculation, only set this 'normal' facet diff --git a/NetBiblio.php b/NetBiblio.php index 1996bef..83855a5 100644 --- a/NetBiblio.php +++ b/NetBiblio.php @@ -538,7 +538,7 @@ class NetBiblio extends WebService $bs = new BookSearch(); $bs->addSortField('random_'.$seed); - $bs->addQuery(1, 'visible'); + $bs->addFilterQuery(1, 'visible'); $results = $bs->getResults($page * $number, $number); return $this->AddBookData($results['books']); } @@ -670,7 +670,7 @@ class NetBiblio extends WebService } if(isset($queryArray['jeunesse']) && $queryArray['jeunesse']['filtrer'] === 'filtrer') { - $bs->addQuery(1, 'jeunesse'); + $bs->addFilterQuery(1, 'jeunesse'); } if(isset($queryArray['duration'])) { @@ -697,7 +697,7 @@ class NetBiblio extends WebService } // we only want visible books in search results - $bs->addQuery(1, 'visible'); + $bs->addFilterQuery(1, 'visible'); $count = isset($queryArray['count']) ? (int) $queryArray['count'] : Configuration::get('solr.result_count'); $start = isset($queryArray['page']) ? $queryArray['page'] * $count : 0; @@ -855,7 +855,7 @@ class NetBiblio extends WebService $s->addSortField('availabilityDate'); // we only want visible books - $s->addQuery(1, 'visible'); + $s->addFilterQuery(1, 'visible'); $results = $s->getResults(0, $number); $books = $this->AddBookData($results['books']);