/** * Accepts a Solarium select result and a search config. * If not the root search result set, you should provide the parent and metaposition. * @param Solarium_Result_Select $result * @param WikiaSearchConfig $searchConfig * @param WikiaSearchResultSet $parent * @param int $metaposition */ public function __construct(Solarium_Result_Select $result, WikiaSearchConfig $searchConfig, $parent = null, $metaposition = null) { wfProfileIn(__METHOD__); parent::__construct(); $this->searchResultObject = $result; $this->searchConfig = $searchConfig; $this->setQuery($searchConfig->getQuery(WikiaSearchConfig::QUERY_ENCODED)); if ($result instanceof Solarium_Result_Select_Empty) { return; } if ($parent === null && $this->searchConfig->getGroupResults()) { $this->setResultGroupings($result, $searchConfig); $this->setResultsFound($this->getHostGrouping()->getMatches()); } else { $this->parent = $parent; $this->metaposition = $metaposition; $this->highlightingObject = $result->getHighlighting(); $this->setResultsStart($result->getStart())->setQueryTime($result->getQueryTime()); if ($this->parent !== null && $this->metaposition !== null) { $this->prepareChildResultSet(); } else { // default behavior for an ungrouped search result set $this->prependArticleMatchIfExists()->setResults($this->searchResultObject->getDocuments())->setResultsFound($this->resultsFound + $this->searchResultObject->getNumFound()); } } wfProfileOut(__METHOD__); }
/** * Utilizes Solr's MoreLikeThis component to return similar pages * @see WikiaSearchTest::testMoreLikeThis * @param WikiaSearchConfig $searchConfig * @return WikiaSearchResultSet */ private function moreLikeThis(WikiaSearchConfig $searchConfig) { $query = $searchConfig->getQuery(WikiaSearchConfig::QUERY_RAW); $streamBody = $searchConfig->getStreamBody(); $streamUrl = $searchConfig->getStreamUrl(); if (!($query || $streamBody || $streamUrl)) { throw new Exception("A query, url, or stream is required."); } $mlt = $this->client->createMoreLikeThis(); $mlt->setMltFields(implode(',', $searchConfig->getMltFields()))->setFields($searchConfig->getRequestedFields())->addParam('mlt.match.include', 'false')->setStart($searchConfig->getStart())->setRows($searchConfig->getRows())->setDocumentClass('WikiaSearchResult'); if ($searchConfig->getInterestingTerms() == 'list') { $mlt->setInterestingTerms('list'); } if ($searchConfig->getMltFilterQuery()) { $mlt->addFilterQuery(array('query' => $searchConfig->getMltFilterQuery(), 'key' => 'mltfilterquery')); } if ($query !== null) { $mlt->setQuery($query); } else { if ($streamBody) { $mlt->addParam('stream.body', $streamBody); } else { if ($streamUrl) { $mlt->addParam('stream.url', $streamUrl); } } } try { $mltResult = $this->client->moreLikeThis($mlt); } catch (Exception $e) { $mltResult = F::build('Solarium_Result_Select_Empty'); Wikia::Log(__METHOD__, '', $e); } $results = F::build('WikiaSearchResultSet', array($mltResult, $searchConfig)); return $results; }