Exemplo n.º 1
0
 /**
  * Computes a score factor for a simple term or a phrase.
  *
  * The default implementation is:
  *   return idfFreq(searcher.docFreq(term), searcher.maxDoc());
  *
  * input - the term in question or array of terms
  * reader - reader the document collection being searched
  * Returns a score factor for the term
  *
  * @param mixed $input
  * @param \Zend\Search\Lucene\SearchIndexInterface $reader
  * @return float a score factor for the term
  */
 public function idf($input, \Zend\Search\Lucene\SearchIndexInterface $reader)
 {
     if (!is_array($input)) {
         return $this->idfFreq($reader->docFreq($input), $reader->count());
     } else {
         $idf = 0.0;
         foreach ($input as $term) {
             $idf += $this->idfFreq($reader->docFreq($term), $reader->count());
         }
         return $idf;
     }
 }
Exemplo n.º 2
0
    /**
     * Calculate result vector for Conjunction query
     * (like '+something +another')
     *
     * @param \Zend\Search\Lucene\SearchIndexInterface $reader
     */
    private function _calculateConjunctionResult(Lucene\SearchIndexInterface $reader)
    {
        $this->_resVector = null;

        if (count($this->_terms) == 0) {
            $this->_resVector = array();
        }

        // Order terms by selectivity
        $docFreqs = array();
        $ids      = array();
        foreach ($this->_terms as $id => $term) {
            $docFreqs[] = $reader->docFreq($term);
            $ids[]      = $id; // Used to keep original order for terms with the same selectivity and omit terms comparison
        }
        array_multisort($docFreqs, SORT_ASC, SORT_NUMERIC,
                        $ids,      SORT_ASC, SORT_NUMERIC,
                        $this->_terms);

        $docsFilter = new Lucene\Index\DocsFilter();
        foreach ($this->_terms as $termId => $term) {
            $termDocs = $reader->termDocs($term, $docsFilter);
        }
        // Treat last retrieved docs vector as a result set
        // (filter collects data for other terms)
        $this->_resVector = array_flip($termDocs);

        foreach ($this->_terms as $termId => $term) {
            $this->_termsFreqs[$termId] = $reader->termFreqs($term, $docsFilter);
        }

        // ksort($this->_resVector, SORT_NUMERIC);
        // Docs are returned ordered. Used algorithms doesn't change elements order.
    }