Пример #1
0
 /**
  * @covers ZendSearch\Lucene\MultiSearcher::find
  * @covers ZendSearch\Lucene\Search\QueryHit::getDocument
  */
 public function testFind()
 {
     $index = new Lucene\MultiSearcher(array(Lucene\Lucene::open(__DIR__ . '/_indexSample/_files'), Lucene\Lucene::open(__DIR__ . '/_indexSample/_files')));
     $hits = $index->find('submitting');
     $this->assertEquals(count($hits), 2 * 3);
     foreach ($hits as $hit) {
         $document = $hit->getDocument();
         $this->assertTrue($document instanceof Lucene\Document);
     }
 }
Пример #2
0
<?php

require 'vendor/autoload.php';
use ZendSearch\Lucene\Lucene;
use ZendSearch\Lucene\MultiSearcher;
use ZendSearch\Lucene\Search\QueryParser;
$stem = function ($e) {
    return \Porter::Stem($e);
};
$q = isset($_GET['q']) ? $_GET['q'] : null;
$q = htmlentities($q);
$q = implode('+', array_map($stem, explode(' ', $q)));
header('Content-Type: application/json');
$output = array();
if ($q) {
    $indexer = Lucene::open('../_index');
    $search = new MultiSearcher(array($indexer));
    $query = QueryParser::parse($q);
    $result = $search->find($query);
    foreach ($result as $hit) {
        $title = strtolower(str_replace('-', ' ', $hit->name));
        $resultUrl = '../' . $hit->fileName;
        $output[] = array('href' => $resultUrl, 'name' => ucfirst($title), 'preview' => $query->htmlFragmentHighlightMatches(substr(preg_replace("/\\s+|{$title}/i", " ", $hit->body), 0, 300) . '...'));
    }
}
echo json_encode($output);
 public function search($query, $contexts = array())
 {
     $searcher = new Lucene\MultiSearcher();
     foreach ($contexts as $indexName) {
         $searcher->addIndex($this->getLuceneIndex($indexName));
     }
     $query = Lucene\Search\QueryParser::parse($query);
     try {
         $luceneHits = $searcher->find($query);
     } catch (\RuntimeException $e) {
         if (!preg_match('&non-wildcard characters&', $e->getMessage())) {
             throw $e;
         }
         $luceneHits = array();
     }
     $hits = array();
     foreach ($luceneHits as $luceneHit) {
         /* @var Lucene\Search\QueryHit $luceneHit */
         $luceneDocument = $luceneHit->getDocument();
         $hit = new Hit();
         $hit->setScore($luceneHit->score);
         $hit->setHash($luceneDocument->getFieldValue(self::HASH_FIELDNAME));
         foreach ($luceneDocument->getFieldNames() as $fieldName) {
             $hit->addMetadata($fieldName, $luceneDocument->getFieldValue($fieldName));
         }
         $hits[] = $hit;
     }
     // The MultiSearcher does not support sorting, so we do it here.
     usort($hits, function (HitInterface $documentA, HitInterface $documentB) {
         if ($documentA->getScore() < $documentB->getScore()) {
             return true;
         }
         return false;
     });
     return $hits;
 }