/** * The sum of squared weights of contained query clauses. * * @return float */ public function sumOfSquaredWeights() { // compute idf $this->_idf = $this->_reader->getSimilarity()->idf($this->_term, $this->_reader); // compute query weight $this->_queryWeight = $this->_idf * $this->_query->getBoost(); // square it return $this->_queryWeight * $this->_queryWeight; }
public function __construct(Zend_Search_Lucene_Search_Query $query, Zend_Search_Lucene_Interface $reader) { $this->_query = $query; $this->_reader = $reader; $this->_weights = array(); $signs = $query->getSigns(); foreach ($query->getSubqueries() as $num => $subquery) { if ($signs === null || $signs[$num] === null || $signs[$num]) { $this->_weights[$num] = $subquery->createWeight($reader); } } }
public function __construct(Zend_Search_Lucene_Search_Query $query, Zend_Search_Lucene_Interface $reader) { $this->_query = $query; $this->_reader = $reader; $this->_weights = array(); $signs = $query->getSigns(); foreach ($query->getTerms() as $id => $term) { if ($signs === null || $signs[$id] === null || $signs[$id]) { $this->_weights[$id] = new Zend_Search_Lucene_Search_Weight_Term($term, $query, $reader); $query->setWeight($id, $this->_weights[$id]); } } }
/** * Assigns the query normalization factor to this. * * @param float $queryNorm */ public function normalize($queryNorm) { // incorporate boost $queryNorm *= $this->_query->getBoost(); foreach ($this->_weights as $weight) { $weight->normalize($queryNorm); } }
/** * Constructor * * @param \Zend_Search_Lucene_Interface Lucene index instance * @param \Zend_Search_Lucene_Search_Query $query Lucene query * @param array $terms Original search terms * @param boolean $highlight Highlight search terms in results * @return void */ public function __construct(\Zend_Search_Lucene_Interface $index, \Zend_Search_Lucene_Search_Query $query, array $terms = array(), $highlight = false) { $this->_index = $index; $this->_query = $query; $this->_terms = $terms; $this->_index->addReference(); // Run the Lucene search and register the results foreach ($this->_index->find($this->_query) as $hit) { $this->_hits[] = \Tollwerk\TwLucenesearch\Domain\Model\QueryHit::cast($hit); } // If search terms should be highlighted ... if (count($this->_hits) && $highlight) { $this->_highlight = array(); foreach ($this->_query->rewrite($this->_index)->getQueryTerms() as $term) { if (!array_key_exists($term->field, $this->_highlight)) { $this->_highlight[$term->field] = array($term->text); } else { $this->_highlight[$term->field][] = $term->text; } } } }
/** * Transform entry to a subquery * * @param string $encoding * @return Zend_Search_Lucene_Search_Query */ public function getQuery($encoding) { $this->_query->setBoost($this->_boost); return $this->_query; }
/** * * @param int $id * @param Zend_Search_Lucene_Search_Query $query * @return array */ public function getDocumentData($id, $query = null) { $highlighter = Axis::single('search/highlighter_default'); $doc = $this->_index->getDocument($id); $result = array('type' => $doc->type, 'nameHighlight' => null === $query ? $doc->name : @$query->htmlFragmentHighlightMatches($doc->name, $this->_encoding, $highlighter), 'name' => $doc->name, 'contents' => null === $query ? $doc->contents : @$query->htmlFragmentHighlightMatches($doc->contents, $this->_encoding, $highlighter), 'urlHighlight' => null === $query ? $doc->url : @$query->htmlFragmentHighlightMatches($doc->url, $this->_encoding, $highlighter), 'url' => $doc->url); if (in_array($doc->type, array('product'))) { $result['image'] = $doc->image; $result['image_title'] = $doc->image_title; } return $result; }
/** * Use the Zend engine to highlight matches for terms in a document * @param Zend_Search_Lucene_Search_Query $query * @param string $content */ private function _highlightMatches(&$query, $content) { $content = preg_replace('/.*<html><body><p>/s', '', $query->highlightMatches($content)); $content = preg_replace('/<\\/p><\\/body><\\/html>/s', '', $content); return $content; }
/** * Return the search terms of a lucene search query within the context of the current index * * @param \Zend_Search_Lucene_Search_Query $query Lucene search query * @return array Search terms */ public function getQueryTerms(\Zend_Search_Lucene_Search_Query $query) { $terms = array(); foreach ($query->rewrite($this->_index)->getQueryTerms() as $term) { if (!array_key_exists($term->field, $terms)) { $terms[$term->field] = array($term->text); } else { $terms[$term->field][] = $term->text; } } return $terms; }
/** * Adds a query. * * @param Zend_Search_Lucene_Search_Query $q */ private function add(Zend_Search_Lucene_Search_Query $q) { $autoClose = false; // apply modifiers foreach ($this->modifiers as $type => $value) { switch ($type) { case self::M_BOOST: $q->setBoost($value); break; case self::M_REQUIREMENT: $q = new Zend_Search_Lucene_Search_Query_Boolean(array($q), array($value)); $autoClose = true; break; } } $this->modifiers = array(); // determine how to add the query if ($this->master === null) { $this->master = $q; } else { $c = count($this->queries); if ($c == 0) { throw new xfLuceneException('Cannot add a query to a ' . get_class($this->master) . ' query, likely a mismatch in creating a boolean query'); } $this->queries[count($this->queries) - 1]->addSubquery($q); } if (!$autoClose && $q instanceof Zend_Search_Lucene_Search_Query_Boolean) { $this->queries[] = $q; } }