/** * 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'); }
/** * 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)); }
{ return sfLuceneCriteria::newInstance(sfLucene::getInstance('testLucene')); } $t->diag('testing constructors'); try { $criteria = new sfLuceneCriteria(sfLucene::getInstance('testLucene')); $t->pass('__construct() takes a sfLucene instance'); } catch (Exception $e) { $t->fail('__construct() takes a sfLuce instance'); } $t->isa_ok(sfLuceneCriteria::newInstance(sfLucene::getInstance('testLucene')), 'sfLuceneCriteria', '::newInstance() returns an sfLuceneCriteria object'); $t->diag('testing ->getQuery()'); $t->isa_ok($criteria->getQuery(), 'Zend_Search_Lucene_Search_Query_Boolean', '->getQuery() returns an instance of ZSL_Search_Query_Boolean'); $t->diag('testing ->add()'); try { $criteria->add('test', true); $t->pass('->add() accepts a string'); $queries = inst()->add('foo')->add('bar')->getQuery()->getSubqueries(); $t->ok($queries[0] == Zend_Search_Lucene_Search_QueryParser::parse('foo'), '->add() correctly parses and adds text queries'); $t->ok($queries[1] == Zend_Search_Lucene_Search_QueryParser::parse('bar'), '->add() correctly parses and adds text queries and keeps them in order'); } catch (Exception $e) { $e->printStackTrace(); $t->fail('->add() accepts a string'); $t->skip('->add() correctly parses and adds text queries'); $t->skip('->add() correctly parses and adds text queries and keeps them in order'); } try { $criteria->add(new Zend_Search_Lucene_Search_Query_Boolean(), false); $t->pass('->add() accepts a Zend query'); $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); $query->addTerm(new Zend_Search_Lucene_Index_Term('word1'), true);
/** * 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; }