public function index() { $oldReqUri = $_SERVER['REQUEST_URI']; $_SERVER['REQUEST_URI'] = ''; $pageModel = new PageModel($this->indexer->getDB()); $elementModel = new ElementModel($this->indexer->getDB()); $searchModel = new SearchModel($this->indexer->getDB()); $stmntPages = $this->indexer->getDB()->prepare("\n\t\t\tSELECT p.ID, p.language_codeFK lang, p.title, p.description, r.pattern, p.role\n\t\t\tFROM page p\n\t\t\tLEFT JOIN route r ON r.page_IDFK = p.ID\n\t\t\tWHERE r.ID IS NOT NULL\n\t\t"); $resPages = $this->indexer->getDB()->select($stmntPages); $indexedPages = 0; foreach ($resPages as $p) { if ($p->role !== 'page') { echo " Skipped page #" . $p->ID . ": reason -> unusable role: " . $p->role . PHP_EOL; continue; } $searchIndexInterface = $this->indexer->getIndex($p->lang); // Index page echo " Indexing page #" . $p->ID . " into index \"" . $p->lang . "\": "; $cmsPage = $pageModel->getPageByID($p->ID); $elementTree = $elementModel->getElementTree($cmsPage); try { $searchableContent = $this->renderElementTreeRecursive($elementTree, $cmsPage->getLanguage()); } catch (\Exception $e) { echo " Error -> " . $e->getMessage() . "\n"; continue; } $searchDoc = new Document(); $searchDoc->setInternalID($p->ID); $searchDoc->setLanguage($p->lang); $searchDoc->setTitle($p->title); $searchDoc->setDescription($searchableContent); $searchDoc->setPath($p->pattern); $searchDoc->setType('core_page'); $docID = $searchModel->saveDocument($searchDoc); $luceneDocument = new \ZendSearch\Lucene\Document(); $luceneDocument->addField(Field::keyword('ID', $docID)); $luceneDocument->addField(Field::unStored('content', $searchableContent)); $luceneDocument->addField(Field::unStored('description', $p->description)); $searchIndexInterface->addDocument($luceneDocument); echo "done"; echo "\n"; ++$indexedPages; } $_SERVER['REQUEST_URI'] = $oldReqUri; echo " Total indexed pages: " . $indexedPages . "\n"; }
/** * @param string $keywords * @param string $language * * @return \stdClass[] */ protected function getCmsSearchResults($keywords, $language) { $searchModel = new SearchModel($this->cmsController->getDB()); $searchIndex = Lucene::open($this->cmsController->getCore()->getSiteRoot() . 'index' . DIRECTORY_SEPARATOR . $language); /*$query = new Boolean(); // new Fuzzy() $query->addSubquery(QueryParser::parse( $keywords ), true);*/ QueryParser::suppressQueryParsingExceptions(); $query = QueryParser::parse($keywords); //$hits = $searchIndex->find($query, 'score', SORT_NUMERIC, SORT_DESC); $hits = $searchIndex->find($query); //echo'<pre>'; var_dump(/*$hits, */$indexSize, $documents); $searchResultsArr = array(); $highlighter = new CmsSearchHighlighter($keywords); //$highlighter = new DefaultHighlighter(); foreach ($hits as $hit) { /** @var QueryHit $hit */ $searchResult = new \stdClass(); // Gibt Zend_Search_Lucene_Document Objekte für diesen Treffer zurück /** @var Document $document */ $document = $hit->getDocument(); $doc = $searchModel->getDocumentByID($document->getFieldUtf8Value('ID')); if ($doc->getID() === null) { continue; } $fldType = $doc->getType(); if ($fldType !== 'core_page') { $contentChunks = $highlighter->highlightMatches(strip_tags($doc->getDescription()), 'UTF-8'); if ($contentChunks == '') { $contentChunks = null; } // Gibt ein Zend_Search_Lucene_Field Objekt von // Zend_Search_Lucene_Document zurück $searchResult->title = $highlighter->highlightMatches(strip_tags($doc->getTitle()), 'UTF-8'); $searchResult->description = $contentChunks; $searchResult->url = $doc->getPath(); if (isset($searchResultsArr[$fldType]) === false) { $stmntModName = $this->cmsController->getDB()->prepare("\n\t\t\t\t\t\tSELECT manifest_content FROM cms_mod_available WHERE name = ?\n\t\t\t\t\t"); $resModName = $this->cmsController->getDB()->select($stmntModName, array($fldType)); $displayName = $fldType; try { $manifestObj = JsonUtils::decode($resModName[0]->manifest_content); if (isset($manifestObj->name->{$language})) { $displayName = $manifestObj->name->{$language}; } elseif (isset($manifestObj->name->en)) { $displayName = $manifestObj->name->en; } } catch (\Exception $e) { } $searchResultsArr[$fldType] = new \stdClass(); $searchResultsArr[$fldType]->title = $displayName; $searchResultsArr[$fldType]->results = array(); } $searchResultsArr[$doc->getType()]->results[] = $searchResult; } else { $contentChunks = $this->createChunkedHighlighting($highlighter->highlightMatches(strip_tags($doc->getDescription()), 'UTF-8')); if ($contentChunks == '') { $contentChunks = null; } // Gibt ein Zend_Search_Lucene_Field Objekt von // Zend_Search_Lucene_Document zurück $searchResult->title = $highlighter->highlightMatches(strip_tags($doc->getTitle()), 'UTF-8'); $searchResult->description = $contentChunks; $searchResult->url = $doc->getPath(); if (isset($searchResultsArr[$fldType]) === false) { $searchResultsArr[$fldType] = new \stdClass(); $searchResultsArr[$fldType]->title = 'Andere Suchresultate'; $searchResultsArr[$fldType]->results = array(); } $searchResultsArr[$doc->getType()]->results[] = $searchResult; } } return $searchResultsArr; }