use filter-query for visible to speed things up

master
Gilles Crettenand 11 years ago
parent c00253d47d
commit 8c0d9bea5f

@ -13,7 +13,10 @@ class BookSearch
private $client; private $client;
/** @var \SolrQuery */ /** @var \SolrQuery */
private $query; private $query;
/** @var array parts of the query, parameter 'q' */
private $queryParts = array(); private $queryParts = array();
/** @var array parts of the filter query, parameter 'fq' */
private $filterQueryParts = array();
public function __construct($edismax = true) public function __construct($edismax = true)
{ {
@ -79,12 +82,20 @@ class BookSearch
} }
if (strlen($queryField) > 0) { if (strlen($queryField) > 0) {
$queryText = "$queryField:\"$queryText\""; $queryText = sprintf('%s:"%s"', $queryField, $queryText);
} }
$this->queryParts[] = $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 = '*') public function addRange($field, $min = '*', $max = '*')
{ {
$this->queryParts[] = sprintf('%s:[%s TO %s]', $field, $min, $max); $this->queryParts[] = sprintf('%s:[%s TO %s]', $field, $min, $max);
@ -136,6 +147,9 @@ class BookSearch
else { else {
$query = implode(' AND ', $this->queryParts); $query = implode(' AND ', $this->queryParts);
} }
foreach($this->filterQueryParts as $fq) {
$this->query->addFilterQuery($fq);
}
$this->query->setQuery($query); $this->query->setQuery($query);
$this->query->setStart($start); $this->query->setStart($start);
$this->query->setRows($count); $this->query->setRows($count);
@ -279,7 +293,7 @@ class BookSearch
public static function GetTerms($field) { public static function GetTerms($field) {
$s = new BookSearch(); $s = new BookSearch();
$s->addQuery(1, 'visible'); $s->addFilterQuery(1, 'visible');
$s->addFacetField($field); $s->addFacetField($field);
$s->setFacetLimits(2000, 10); $s->setFacetLimits(2000, 10);
$results = $s->getResults(0, 0); $results = $s->getResults(0, 0);
@ -290,7 +304,7 @@ class BookSearch
public static function GetTermsRange($field) { public static function GetTermsRange($field) {
$s = new BookSearch(); $s = new BookSearch();
$s->addQuery(1, 'visible'); $s->addFilterQuery(1, 'visible');
$s->setFacetRangeField($field); $s->setFacetRangeField($field);
$s->setFacetRange(0, 250, 1); $s->setFacetRange(0, 250, 1);
// to avoid useless calculation, only set this 'normal' facet // to avoid useless calculation, only set this 'normal' facet

@ -538,7 +538,7 @@ class NetBiblio extends WebService
$bs = new BookSearch(); $bs = new BookSearch();
$bs->addSortField('random_'.$seed); $bs->addSortField('random_'.$seed);
$bs->addQuery(1, 'visible'); $bs->addFilterQuery(1, 'visible');
$results = $bs->getResults($page * $number, $number); $results = $bs->getResults($page * $number, $number);
return $this->AddBookData($results['books']); return $this->AddBookData($results['books']);
} }
@ -670,7 +670,7 @@ class NetBiblio extends WebService
} }
if(isset($queryArray['jeunesse']) && $queryArray['jeunesse']['filtrer'] === 'filtrer') { if(isset($queryArray['jeunesse']) && $queryArray['jeunesse']['filtrer'] === 'filtrer') {
$bs->addQuery(1, 'jeunesse'); $bs->addFilterQuery(1, 'jeunesse');
} }
if(isset($queryArray['duration'])) { if(isset($queryArray['duration'])) {
@ -697,7 +697,7 @@ class NetBiblio extends WebService
} }
// we only want visible books in search results // 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'); $count = isset($queryArray['count']) ? (int) $queryArray['count'] : Configuration::get('solr.result_count');
$start = isset($queryArray['page']) ? $queryArray['page'] * $count : 0; $start = isset($queryArray['page']) ? $queryArray['page'] * $count : 0;
@ -855,7 +855,7 @@ class NetBiblio extends WebService
$s->addSortField('availabilityDate'); $s->addSortField('availabilityDate');
// we only want visible books // we only want visible books
$s->addQuery(1, 'visible'); $s->addFilterQuery(1, 'visible');
$results = $s->getResults(0, $number); $results = $s->getResults(0, $number);
$books = $this->AddBookData($results['books']); $books = $this->AddBookData($results['books']);

Loading…
Cancel
Save