public function executeSearch() { $feed = new sfAtom1Feed(); $feed->setTitle('Hoydaa Snippets'); $feed->setLink('http://codesnippet.hoydaa.org'); $feed->setAuthorEmail('*****@*****.**'); $feed->setAuthorName('Hoydaa Snippets'); $querystring = $this->getRequestParameter('q'); $query = new sfLuceneCriteria($this->getLuceneInstance()); $query->addDescendingSortBy('createdat'); $query->addSane($querystring); $pager = new sfLucenePager($this->getLuceneInstance()->friendlyFind($query)); $num = $pager->getNbResults(); if ($num > 0) { $pager->setMaxPerPage(10); $pager->setPage(1); foreach ($pager->getResults() as $result) { $item = new sfFeedItem(); $item->setTitle($result->getTitle()); $item->setLink('snippet/show?id=' . $result->getId()); $item->setAuthorName($result->getContributor()); $item->setPubDate(strtotime($result->getCreatedAt())); //$item->setAuthorEmail(($code->getSfGuardUser() ? // $code->getSfGuardUser()->getProfile()->getEmail() : $code->getEmail())); $item->setUniqueId($result->getId()); $item->setDescription($result->getSummary()); $feed->addItem($item); } } $this->feed = $feed; $this->setTemplate('feed'); }
/** * @see sfTask */ protected function execute($arguments = array(), $options = array()) { $config = sfLucene::getConfig(); $query = $arguments['query']; // check and reduce indexes if ($options['index'] !== null) { if (!in_array($options['index'], array_keys($config))) { throw new Exception('Index %s not exist', $options['index']); } $config = array($config[$options['index']]); } // build the lucene criteria $criteria = sfLuceneCriteria::newInstance()->addPhrase($query)->setOffset($options['start'])->setLimit($options['limit']); // walk over the indexes foreach ($config as $index => $indexConfig) { // check culture $cultures = $indexConfig['index']['cultures']; if ($options['culture'] !== null) { if (!in_array($options['culture'], $cultures)) { //TODO: change to log error throw new Exception(sprintf('Culture %s is not configurate for index %s', $options['culture'], $index)); } $cultures = array($options['culture']); } $this->log(sprintf('search for `%s` from %u to %u', $query, $options['start'], $options['limit'])); // walk over the cultures foreach ($cultures as $culture) { // get lucene instance and retrieve the results $results = sfLucene::getInstance($index, $culture)->friendlyFind($criteria); $this->log(sprintf('found %u results in index `%s` with culture `%s`', count($results), $index, $culture)); foreach ($results as $result) { $this->logSection('result ', sprintf('%s %s (%u%%)', $result->getInternalModel(), $result->getInternalTitle(), $result->getScore())); } } } }
$lucene->find($query); $t->ok($query == $mock->args[0], '->find() accepts Zend API queries'); $t->isa_ok($mock->scoring, 'Zend_Search_Lucene_Search_Similarity_Default', '->find() with a Zend API queries uses default scoring algorithm'); $scoring = new MockScoring(); $lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->setScoringAlgorithm($scoring)); $t->is($mock->scoring, $scoring, '->find() changes the scoring algorithm if sfLuceneCriteria specifies it'); $t->isa_ok(Zend_Search_Lucene_Search_Similarity::getDefault(), 'Zend_Search_Lucene_Search_Similarity_Default', '->find() resets the default scoring algorithm after processing'); $lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->addAscendingSortBy('sort1')->addDescendingSortBy('sort2', SORT_NUMERIC)); $t->is_deeply(array_splice($mock->args, 1), array('sort1', SORT_REGULAR, SORT_ASC, 'sort2', SORT_NUMERIC, SORT_DESC), '->find() uses sorting rules from sfLuceneCriteria'); $results = $lucene->friendlyFind('foo'); $t->isa_ok($results, 'sfLuceneResults', '->friendlyFind() returns an instance of sfLuceneResults'); $t->is($results->toArray(), range(1, 100), '->friendlyFind() houses the data from ZSL'); $t->is($results->getSearch(), $lucene, '->friendlyFind() is connected to the Lucene instance'); $mock->e = true; try { $lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->setScoringAlgorithm(new MockScoring())); $t->fail('if ZSL throws exception, ->find() also throws the exception'); $t->skip('if ZSL throws exception, ->find() stills resets the scoring algorithm'); } catch (Exception $e) { $t->pass('if ZSL throws exception, ->find() also throws the exception'); $t->isa_ok(Zend_Search_Lucene_Search_Similarity::getDefault(), 'Zend_Search_Lucene_Search_Similarity_Default', 'if ZSL throws exception, ->find() stills resets the scoring algorithm'); } $lucene->forceLucene($originalLucene); $t->diag('testing ->rebuildIndex()'); class MockIndexerFactory { public $handlers, $deleteLock = false, $search; public function __construct($h, $s) { $this->handlers = $h; $this->search = $s;
function inst() { return sfLuceneCriteria::newInstance(); }
/** * This action is a friendly advanced search interface. It lets the * user use a form to control some of the advanced query syntaxes. */ public function executeAdvanced($request) { // disable this action if advanced searching is disabled. $this->forward404Unless(sfConfig::get('app_lucene_advanced', true) == true, 'advanced support is disabled'); // determine if the "Basic" button was clicked if ($request->getParameter('commit') == $this->translate('Basic')) { $this->redirect($this->getModuleName() . '/search'); } $form = new sfLuceneAdvancedForm(); $this->configureCategories($form); $this->form = $form; // continue only if there was a submit if (!$request->getParameter($form->getName())) { return sfView::SUCCESS; } $form->bind($request->getParameter($form->getName())); $values = $form->getValues(); // build the criteria $c = new sfLuceneCriteria(); $c->addSane($values['keywords']); $query = $values['keywords']; // build the must have part $keywords = preg_split("/[\\s,]+/", $values['musthave']); foreach ($keywords as $keyword) { $c->add("+" . sfLuceneCriteria::sanitize($keyword), sfLuceneCriteria::TYPE_NONE, true); } $query .= ' ' . $values['musthave']; // build the must have part $keywords = preg_split("/[\\s,]+/", $values['mustnothave']); foreach ($keywords as $keyword) { $c->add("-" . sfLuceneCriteria::sanitize($keyword), sfLuceneCriteria::TYPE_NONE, true); } $query .= ' ' . $values['mustnothave']; // build the has pharse part $c->add("+" . sfLuceneCriteria::sanitize($values['hasphrase']), sfLuceneCriteria::TYPE_NONE, true); $query .= ' ' . $values['hasphrase']; if (sfConfig::get('app_lucene_categories', true) && isset($values['category']) && $values['category'] != $this->translate('All')) { $c->add('sfl_category: ' . $values['category']); } $pager = new sfLucenePager($this->getLuceneInstance()->friendlyFind($c)); // display results $pager = $this->configurePager($pager, $form); $this->getContext()->getConfiguration()->loadHelpers('sfLucene'); $this->pager = $pager; $this->query = $query; $this->setTitleI18n('Advanced Search'); }
function inst() { return sfLuceneCriteria::newInstance(sfLucene::getInstance('testLucene')); }
function inst($app_configuration) { return sfLuceneCriteria::newInstance(); }
/** * For each result, converts geo_distance field value to the specified unit * (localsolr internally works in miles) * * @author Julien Lirochon <*****@*****.**> * @param int $unit * @return void */ protected function convertGeoDistances($unit = sfLuceneGeoCriteria::UNIT_KILOMETERS) { $ratio = sfLuceneCriteria::getGeoUnitRatio($unit); if ($ratio != 1) { foreach ($this->results->response->docs as $index => $doc) { if (isset($doc->{sfLuceneGeoCriteria::DISTANCE_FIELD})) { $this->results->response->docs[$index]->{sfLuceneGeoCriteria::DISTANCE_FIELD} = $doc->{sfLuceneGeoCriteria::DISTANCE_FIELD} / $ratio; } } } }
/** * Wrapper function for getting the results. */ protected function getResults($form) { $data = $form->getValues(); $query = new sfLuceneCriteria($this->getLuceneInstance()); $query->addSane($data['query']); if (sfConfig::get('app_lucene_categories', true) && isset($data['category']) && $data['category'] != $this->translate('All')) { $query->add('sfl_category: ' . $data['category']); } return new sfLucenePager($this->getLuceneInstance()->friendlyFind($query)); }
/** * Wrapper for Lucene's find() * @param mixed $query The query * @return array The array of results */ public function find($query) { $this->configure(); $timer = sfTimerManager::getTimer('Zend Search Lucene Find'); $sort = array(); $scoring = null; if ($query instanceof sfLuceneCriteria) { foreach ($query->getSorts() as $sortable) { $sort[] = $sortable['field']; $sort[] = $sortable['type']; $sort[] = $sortable['order']; } $scoring = $query->getScoringAlgorithm(); $query = $query->getQuery(); } elseif (is_string($query)) { $query = sfLuceneCriteria::newInstance($this)->addString($query)->getQuery(); } $defaultScoring = Zend_Search_Lucene_Search_Similarity::getDefault(); if ($scoring) { Zend_Search_Lucene_Search_Similarity::setDefault($scoring); } try { // as we rarely sort, we can avoid the overhead of call_user_func() with this conditional if (count($sort)) { $args = array_merge(array($query), $sort); $results = call_user_func_array(array($this->getLucene(), 'find'), $args); } else { $results = $this->getLucene()->find($query); } } catch (Exception $e) { Zend_Search_Lucene_Search_Similarity::setDefault($defaultScoring); $timer->addTime(); throw $e; } Zend_Search_Lucene_Search_Similarity::setDefault($defaultScoring); $timer->addTime(); return $results; }
/** * Wrapper for Lucene's find() * @param mixed $query The query * @return array The array of results */ public function find($query, $is_sane = false) { $this->configure(); $timer = sfTimerManager::getTimer('Solr Search Lucene Find'); if (is_string($query)) { $criteria = sfLuceneCriteria::newInstance(); if ($is_sane) { $criteria->add($query, sfLuceneCriteria::TYPE_AND, true); } else { $criteria->addString($query); } $query = $criteria; } try { $change_path = $query->getPath(); if ($change_path) { $old_path = $this->getSearchService()->getPath(); $this->getSearchService()->setPath($query->getPath()); } $results = $this->getSearchService()->search($query->getQuery(), $query->getOffset(), $query->getLimit(), $query->getParams(), $query->getHttpMethod()); if ($change_path) { $this->getSearchService()->setPath($old_path); } } catch (Exception $e) { $timer->addTime(); throw $e; } $timer->addTime(); return $results; }
{ if ($this->e) { throw new Exception('Because you said so'); } $this->args = func_get_args(); return range(1, 100); } } $mock = new MockLucene(); $originalLucene = $lucene->getLucene(); $lucene->forceLucene($mock); $t->is($lucene->find('foo'), range(1, 100), '->find() returns what ZSL returns'); $query = sfLuceneCriteria::newInstance($lucene)->add('foo')->addRange('a', 'b', 'c'); $lucene->find($query); $t->ok($query->getQuery() == $mock->args[0], '->find() accepts sfLuceneCriteria queries'); $lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->addAscendingSortBy('sort1')->addDescendingSortBy('sort2', SORT_DESC)->addSortBy('sort3')); $t->is_deeply(array_splice($mock->args, 1), array(0, 10, array('fl' => array('*,score'), 'sort' => array('score desc, sort1 asc, sort2 desc, sort3 asc')), 'GET'), '->find() uses sorting rules from sfLuceneCriteria'); $mock->e = true; $lucene->forceLucene($originalLucene); $t->diag('testing ->rebuildIndex()'); class MockIndexerFactory { public $handlers, $deleteLock = false, $search; public function __construct($h, $s) { $this->handlers = $h; $this->search = $s; } public function getHandlers() { $this->deleteLock = $this->search->getParameter('delete_lock');
/** * This method try to parse the provided $phrase into a valid solr query * The method can handle +/- and quote grouping * * @param string $field * @param string $phrase * @return sfLuceneCriteria */ public function addPhraseFieldGuess($field, $full_phrase, $type = sfLuceneCriteria::TYPE_AND) { $main_criteria = new sfLuceneCriteria(); foreach ($this->guessParts($full_phrase) as $section => $phrases) { if (count($phrases) == 0) { continue; } $inner_type = $section == 'must_contains' || $section == 'must_not_contains' ? 'AND' : 'OR'; $sign = $section == 'must_contains' ? '+' : ($section == 'must_not_contains' ? '-' : ''); $c = new sfLuceneCriteria(); foreach ($phrases as $phrase) { $c->add($sign . '(' . self::sanitize($phrase) . ')', $inner_type, true); } $main_criteria->add('(' . $c->getQuery() . ')', 'AND', true); } $this->addField($field, $main_criteria, $type, true); return $this; }