/** * Score calculator for non conjunction queries (not all terms are required) * * @param integer $docId * @param Zend_Search_Lucene $reader * @return float */ public function _nonConjunctionScore($docId, $reader) { if ($this->_coord === null) { $this->_coord = array(); $maxCoord = 0; foreach ($this->_signs as $sign) { if ($sign !== false) { $maxCoord++; } } for ($count = 0; $count <= $maxCoord; $count++) { $this->_coord[$count] = $reader->getSimilarity()->coord($count, $maxCoord); } } $score = 0.0; $matchedTerms = 0; foreach ($this->_terms as $termId => $term) { // Check if term is if ($this->_signs[$termId] !== false && isset($this->_termsPositions[$termId][$docId])) { $matchedTerms++; $score += $reader->getSimilarity()->tf(count($this->_termsPositions[$termId][$docId])) * $this->_weights[$termId]->getValue() * $reader->norm($docId, $term->field); } } return $score * $this->_coord[$matchedTerms]; }
/** * Score specified document * * @param integer $docId * @param Zend_Search_Lucene $reader * @return float */ public function score($docId, $reader) { if (isset($this->_docVector[$docId])) { return $reader->getSimilarity()->tf(count($this->_termPositions[$docId])) * $this->_weight->getValue() * $reader->norm($docId, $this->_term->field) * $this->getBoost(); } else { return 0; } }