public function getQuery($encoding) { if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) { require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.'); } $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $encoding); if (count($tokens) == 0) { return new Zend_Search_Lucene_Search_Query_Insignificant(); } if (count($tokens) == 1) { $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); $query = new Zend_Search_Lucene_Search_Query_Term($term); $query->setBoost($this->_boost); return $query; } //It's not empty or one term query $position = -1; $query = new Zend_Search_Lucene_Search_Query_Phrase(); foreach ($tokens as $token) { $position += $token->getPositionIncrement(); $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); $query->addTerm($term, $position); } if ($this->_proximityQuery) { $query->setSlop($this->_wordsDistance); } $query->setBoost($this->_boost); return $query; }
public function searchAction() { Zend_Registry::set('theaction', 'content'); $this->toTpl('theInclude', 'list'); Zend_Registry::set('module', 'Search Results'); //error_reporting(E_ALL); $data = $this->_request->getParams(); if (trim($data['q'])) { $dirs = $this->dirs; $word = strtolower($data['q']); $index = new Zend_Search_Lucene(APPL_PATH . $dirs['structure']['indexes'] . DIR_SEP . "objects"); $exp = explode(" ", $word); $query = new Zend_Search_Lucene_Search_Query_Phrase($exp); $query->setSlop(2); //get all available indexed Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive()); Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('utf-8'); Zend_Search_Lucene::setResultSetLimit(10); $result = $index->find($query); foreach ($result as $hit) { $obj = $this->getAllBySlug($hit->slug); $type = $this->getContentType($obj['type_id']); $content = $this->getContent($type['title'], $obj['id']); $resu[] = $content; } $resu = $this->doQoolHook('front_pre_assign_search_results', $resu); $this->toTpl('content', $resu); } else { $params = array("message" => $this->t("Please fill in a search term"), "msgtype" => 'error'); $this->addMessage($params); $this->_helper->redirector('index', 'index', 'default'); } }
/** * Transform entry to a subquery * * @param string $encoding * @return Zend_Search_Lucene_Search_Query * @throws Zend_Search_Lucene_Search_QueryParserException */ public function getQuery($encoding) { if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) { require_once __CA_LIB_DIR__ . '/core/Zend/Search/Lucene/Search/QueryParserException.php'; throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.'); } $tokens = explode(" ", $this->_phrase); if (count($tokens) == 0) { return new Zend_Search_Lucene_Search_Query_Insignificant(); } if (count($tokens) == 1) { $term = new Zend_Search_Lucene_Index_Term(strtolower($tokens[0]), $this->_field); $query = new Zend_Search_Lucene_Search_Query_Term($term); $query->setBoost($this->_boost); return $query; } //It's not empty or one term query $query = new Zend_Search_Lucene_Search_Query_Phrase(); foreach ($tokens as $token) { $term = new Zend_Search_Lucene_Index_Term(strtolower($token), $this->_field); $query->addTerm($term); } if ($this->_proximityQuery) { $query->setSlop($this->_wordsDistance); } $query->setBoost($this->_boost); return $query; }
/** * @see xfCriterionTranslator */ public function createPhrase($phrase, $slop) { $phrase = preg_split('/\\s+/', $phrase); $p = new Zend_Search_Lucene_Search_Query_Phrase($phrase, null, $this->popFieldModifier()); $p->setSlop($slop); $this->add($p); }
/** * The sum of squared weights of contained query clauses. * * @return float */ public function sumOfSquaredWeights() { // compute idf $this->_idf = $this->_reader->getSimilarity()->idf($this->_query->getTerms(), $this->_reader); // compute query weight $this->_queryWeight = $this->_idf * $this->_query->getBoost(); // square it return $this->_queryWeight * $this->_queryWeight; }
/** * @param \Zend_Search_Lucene_Search_Query_Phrase $po_query * @return array */ public function getFiltersForPhraseQuery($po_query) { $va_terms = $va_return = array(); $vs_fld = null; foreach ($po_query->getQueryTerms() as $o_term) { $o_term = caRewriteElasticSearchTermFieldSpec($o_term); $vs_fld = str_replace('\\', '', $o_term->field); $va_terms[] = $o_term->text; } $va_parsed_values = caGetISODates(join(' ', $va_terms)); $va_return[] = array('range' => array($vs_fld => array('lte' => $va_parsed_values['end']))); $va_return[] = array('range' => array($vs_fld => array('gte' => $va_parsed_values['start']))); return $va_return; }
public function rewrite(Zend_Search_Lucene_Interface $index) { if (count($this->_terms) == 0) { return new Zend_Search_Lucene_Search_Query_Empty(); } else { if ($this->_terms[0]->field !== null) { return $this; } else { $query = new Zend_Search_Lucene_Search_Query_Boolean(); $query->setBoost($this->getBoost()); foreach ($index->getFieldNames(true) as $fieldName) { $subquery = new Zend_Search_Lucene_Search_Query_Phrase(); $subquery->setSlop($this->getSlop()); foreach ($this->_terms as $termId => $term) { $qualifiedTerm = new Zend_Search_Lucene_Index_Term($term->text, $fieldName); $subquery->addTerm($qualifiedTerm, $this->_offsets[$termId]); } $query->addSubquery($subquery); } return $query; } } }
/** * Re-write query into primitive queries in the context of specified index * * @param Zend_Search_Lucene_Interface $index * @return Zend_Search_Lucene_Search_Query */ public function rewrite(Zend_Search_Lucene_Interface $index) { // Allow to use wildcards within phrases // They are either removed by text analyzer or used as a part of keyword for keyword fields // // if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) { // require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; // throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.'); // } // Split query into subqueries if field name is not specified if ($this->_field === null) { require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; $query = new Zend_Search_Lucene_Search_Query_Boolean(); $query->setBoost($this->getBoost()); require_once 'Zend/Search/Lucene.php'; if (Zend_Search_Lucene::getDefaultSearchField() === null) { $searchFields = $index->getFieldNames(true); } else { $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); } foreach ($searchFields as $fieldName) { $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase, $this->_phraseEncoding, $fieldName); $subquery->setSlop($this->getSlop()); $query->addSubquery($subquery->rewrite($index)); } $this->_matches = $query->getQueryTerms(); return $query; } // Recognize exact term matching (it corresponds to Keyword fields stored in the index) // encoding is not used since we expect binary matching require_once 'Zend/Search/Lucene/Index/Term.php'; $term = new Zend_Search_Lucene_Index_Term($this->_phrase, $this->_field); if ($index->hasTerm($term)) { require_once 'Zend/Search/Lucene/Search/Query/Term.php'; $query = new Zend_Search_Lucene_Search_Query_Term($term); $query->setBoost($this->getBoost()); $this->_matches = $query->getQueryTerms(); return $query; } // tokenize phrase using current analyzer and process it as a phrase query require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding); if (count($tokens) == 0) { $this->_matches = array(); require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; return new Zend_Search_Lucene_Search_Query_Insignificant(); } if (count($tokens) == 1) { require_once 'Zend/Search/Lucene/Index/Term.php'; $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); require_once 'Zend/Search/Lucene/Search/Query/Term.php'; $query = new Zend_Search_Lucene_Search_Query_Term($term); $query->setBoost($this->getBoost()); $this->_matches = $query->getQueryTerms(); return $query; } //It's non-trivial phrase query $position = -1; require_once 'Zend/Search/Lucene/Search/Query/Phrase.php'; $query = new Zend_Search_Lucene_Search_Query_Phrase(); require_once 'Zend/Search/Lucene/Index/Term.php'; foreach ($tokens as $token) { $position += $token->getPositionIncrement(); $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); $query->addTerm($term, $position); $query->setSlop($this->getSlop()); } $this->_matches = $query->getQueryTerms(); return $query; }
$t->diag('testing addWildcard()'); $s = inst()->addWildcard('foo*', 'bar')->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Wildcard(new Zend_Search_Lucene_Index_Term('foo*', 'bar')); $t->ok($s[0] == $q, '->addWildcard() registers the correct query with mutlitple character wildcards'); $s = inst()->addWildcard('f?o', 'bar')->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Wildcard(new Zend_Search_Lucene_Index_Term('f?o', 'bar')); $t->ok($s[0] == $q, '->addWildcard() registers the correct query with single character wildcards'); $s = inst()->addWildcard('foo* baz?', 'bar')->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Wildcard(new Zend_Search_Lucene_Index_Term('foo* baz?', 'bar')); $t->ok($s[0] == $q, '->addWildcard() registers the correct query with mixing character wildcards'); $t->diag('testing addPhrase()'); $s = inst()->addPhrase(array('foo', 'bar'))->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Phrase(array('foo', 'bar'), null, null); $t->ok($s[0] == $q, '->addPhrase() registers the correct simple phrase query'); $s = inst()->addPhrase(array(0 => 'foo', 2 => 'bar'), 'baz', 2, true)->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Phrase(array('foo', 'bar'), array(0, 2), 'baz'); $q->setSlop(2); $t->ok($s[0] == $q, '->addPhrase() registers the correct complex phrase query'); $t->diag('testing addRange()'); $s = inst()->addRange('a', 'b')->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Range(new Zend_Search_Lucene_Index_Term('a'), new Zend_Search_Lucene_Index_Term('b'), true); $t->ok($s[0] == $s[0], '->addRange() registers a simple, two-way range'); $s = inst()->addRange('a')->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Range(new Zend_Search_Lucene_Index_Term('a'), null, true); $t->ok($s[0] == $s[0], '->addRange() registers a simple, one-way forward range'); $s = inst()->addRange(null, 'b')->getQuery()->getSubqueries(); $q = new Zend_Search_Lucene_Search_Query_Range(null, new Zend_Search_Lucene_Index_Term('b'), true); $t->ok($s[0] == $s[0], '->addRange() registers a simple, one-way backward range'); try { $s = inst()->addRange(null, null); $t->fail('->addRange() rejects a query with no range');
/** * Re-write query into primitive queries in the context of specified index * * @param Zend_Search_Lucene_Interface $index * @return Zend_Search_Lucene_Search_Query */ public function rewrite(Zend_Search_Lucene_Interface $index) { if (count($this->_terms) == 0) { require_once sfConfig::get('sf_lib_dir') . '/modules/search/lib/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } else { if ($this->_terms[0]->field !== null) { return $this; } else { require_once sfConfig::get('sf_lib_dir') . '/modules/search/lib/Lucene/Search/Query/Boolean.php'; $query = new Zend_Search_Lucene_Search_Query_Boolean(); $query->setBoost($this->getBoost()); foreach ($index->getFieldNames(true) as $fieldName) { $subquery = new Zend_Search_Lucene_Search_Query_Phrase(); $subquery->setSlop($this->getSlop()); require_once sfConfig::get('sf_lib_dir') . '/modules/search/lib/Lucene/Index/Term.php'; foreach ($this->_terms as $termId => $term) { $qualifiedTerm = new Zend_Search_Lucene_Index_Term($term->text, $fieldName); $subquery->addTerm($qualifiedTerm, $this->_offsets[$termId]); } $query->addSubquery($subquery); } return $query; } } }
/** * Adds a phrase query * * @return sfLuceneCriteria */ public function addPhrase($keywords, $field = null, $slop = 0, $type = true) { $query = new Zend_Search_Lucene_Search_Query_Phrase(array_values($keywords), array_keys($keywords), $field); $query->setSlop($slop); return $this->add($query, $type); }
/** * @param \Zend_Search_Lucene_Search_Query_Phrase $o_subquery * @return mixed */ public function getFilterForPhraseQuery($o_subquery) { $va_terms = array(); foreach ($o_subquery->getQueryTerms() as $o_term) { $o_term = caRewriteElasticSearchTermFieldSpec($o_term); $va_terms[] = $o_term->text; } $va_parsed_search = caParseGISSearch(join(' ', $va_terms)); $va_return[str_replace('\\', '', $o_term->field)] = array('shape' => array('type' => 'envelope', 'coordinates' => array(array((double) $va_parsed_search['min_longitude'], (double) $va_parsed_search['min_latitude']), array((double) $va_parsed_search['max_longitude'], (double) $va_parsed_search['max_latitude'])))); return $va_return; }
public function searchAction() { Zend_Registry::set('theaction', 'content'); $this->toTpl('theInclude', 'search'); Zend_Registry::set('module', 'Search Results'); //error_reporting(E_ALL); $data = $this->_request->getParams(); $dirs = $this->dirs; $word = strtolower($data['q']); $index = new Zend_Search_Lucene(APPL_PATH . $dirs['structure']['indexes'] . DIR_SEP . "objects"); $exp = explode(" ", $word); $query = new Zend_Search_Lucene_Search_Query_Phrase($exp); $query->setSlop(2); //get all available indexed Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive()); Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('utf-8'); Zend_Search_Lucene::setResultSetLimit(10); $result = $index->find($query); foreach ($result as $hit) { $cid = $this->getIdBySlug($hit->slug); $content = $this->getContent($hit->type_id, $cid); $content['id'] = $cid; $content['type_id'] = $hit->type_id; $content['type'] = $this->getContentType($hit->type_id); $resu[] = $content; } $this->toTpl('theList', $resu); }
public function rewrite(Zend_Search_Lucene_Interface $index) { if ($this->_field === null) { $query = new Zend_Search_Lucene_Search_Query_Boolean(); $query->setBoost($this->getBoost()); if (Zend_Search_Lucene::getDefaultSearchField() === null) { $searchFields = $index->getFieldNames(true); } else { $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); } foreach ($searchFields as $fieldName) { $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase, $this->_phraseEncoding, $fieldName); $subquery->setSlop($this->getSlop()); $query->addSubquery($subquery->rewrite($index)); } $this->_matches = $query->getQueryTerms(); return $query; } $term = new Zend_Search_Lucene_Index_Term($this->_phrase, $this->_field); if ($index->hasTerm($term)) { $query = new Zend_Search_Lucene_Search_Query_Term($term); $query->setBoost($this->getBoost()); $this->_matches = $query->getQueryTerms(); return $query; } $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding); if (count($tokens) == 0) { $this->_matches = array(); return new Zend_Search_Lucene_Search_Query_Insignificant(); } if (count($tokens) == 1) { $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); $query = new Zend_Search_Lucene_Search_Query_Term($term); $query->setBoost($this->getBoost()); $this->_matches = $query->getQueryTerms(); return $query; } $position = -1; $query = new Zend_Search_Lucene_Search_Query_Phrase(); foreach ($tokens as $token) { $position += $token->getPositionIncrement(); $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); $query->addTerm($term, $position); $query->setSlop($this->getSlop()); } $this->_matches = $query->getQueryTerms(); return $query; }
/** * Transform entry to a subquery * * @return Zend_Search_Lucene_Search_Query * @throws Zend_Search_Lucene_Search_QueryParserException */ public function getQuery() { if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) { throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.'); } $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase); if (count($tokens) == 0) { return new Zend_Search_Lucene_Search_Query_Empty(); } if (count($tokens) == 1) { $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); $query = new Zend_Search_Lucene_Search_Query_Term($term); $query->setBoost($this->_boost); return $query; } //It's not empty or one term query $query = new Zend_Search_Lucene_Search_Query_Phrase(); foreach ($tokens as $token) { $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); $query->addTerm($term, true); // all subterms are required } if ($this->_proximityQuery) { $query->setSlop($this->_wordsDistance); } $query->setBoost($this->_boost); return $query; }