/** * Perform a search and return a JSON response. * * @param Request $request * * @return JsonResponse */ public function searchAction(Request $request) { $queryString = $request->query->get('q'); $category = $request->query->get('category', null); $locale = $request->query->get('locale', null); $page = $this->listRestHelper->getPage(); $limit = $this->listRestHelper->getLimit(); $aggregateHits = []; $startTime = microtime(true); $categories = $category ? [$category] : $this->searchManager->getCategoryNames(); foreach ($categories as $category) { $query = $this->searchManager->createSearch($queryString); if ($locale) { $query->locale($locale); } if ($category) { $query->category($category); } foreach ($query->execute() as $hit) { $aggregateHits[] = $hit; } } $time = microtime(true) - $startTime; $adapter = new ArrayAdapter($aggregateHits); $pager = new Pagerfanta($adapter); $pager->setMaxPerPage($limit); $pager->setCurrentPage($page); $representation = new SearchResultRepresentation(new CollectionRepresentation($pager->getCurrentPageResults(), 'result'), 'sulu_search_search', ['locale' => $locale, 'query' => $query, 'category' => $category], (int) $page, (int) $limit, $pager->getNbPages(), 'page', 'limit', false, count($aggregateHits), $this->getCategoryTotals($aggregateHits), number_format($time, 8)); $view = View::create($representation); $context = SerializationContext::create(); $context->enableMaxDepthChecks(); $context->setSerializeNull(true); $view->setSerializationContext($context); return $this->viewHandler->handle($view); }
/** * Perform a search and return a JSON response. * * @param Request $request * * @return Response */ public function searchAction(Request $request) { $queryString = $request->query->get('q'); $index = $request->query->get('index', null); $locale = $request->query->get('locale', null); $page = $this->listRestHelper->getPage(); $limit = $this->listRestHelper->getLimit(); $startTime = microtime(true); $indexes = $index ? [$index] : $this->getAllowedIndexes(); $query = $this->searchManager->createSearch($queryString); if ($locale) { $query->locale($locale); } $query->indexes($indexes); $query->setLimit($limit); $time = microtime(true) - $startTime; $adapter = new ArrayAdapter(iterator_to_array($query->execute())); $pager = new Pagerfanta($adapter); $pager->setMaxPerPage($limit); $pager->setCurrentPage($page); $representation = new SearchResultRepresentation(new CollectionRepresentation($pager->getCurrentPageResults(), 'result'), 'sulu_search_search', ['locale' => $locale, 'query' => $query, 'index' => $index], (int) $page, (int) $limit, $pager->getNbPages(), 'page', 'limit', false, $adapter->getNbResults(), $this->getIndexTotals($adapter->getArray()), number_format($time, 8)); $view = View::create($representation); $context = SerializationContext::create(); $context->enableMaxDepthChecks(); $context->setSerializeNull(true); $view->setSerializationContext($context); return $this->viewHandler->handle($view); }
/** * {@inheritdoc} */ public function find(array $ids, $locale) { $statements = array_map(function ($item) { return sprintf('__id:"%s"', $item); }, $ids); $result = []; $searchResult = $this->searchManager->createSearch(implode(' OR ', $statements))->indexes($this->getPageIndexes())->execute(); /** @var QueryHit $item */ foreach ($searchResult as $item) { $document = $item->getDocument(); $title = $document->getField('title')->getValue(); $excerptTitle = $document->getField('excerptTitle')->getValue(); $excerptDescription = $document->getField('excerptDescription')->getValue(); $excerptMedia = $this->getMedia($document, 'excerptImages'); $teaserDescription = $document->hasField(StructureProvider::FIELD_TEASER_DESCRIPTION) ? $document->getField(StructureProvider::FIELD_TEASER_DESCRIPTION)->getValue() : ''; $teaserMedia = $document->hasField(StructureProvider::FIELD_TEASER_MEDIA) ? $this->getMedia($document, StructureProvider::FIELD_TEASER_MEDIA) : null; $result[] = new Teaser($item->getId(), 'content', $locale, '' !== $excerptTitle ? $excerptTitle : $title, '' !== $excerptDescription ? $excerptDescription : $teaserDescription, $document->getField('excerptMore')->getValue(), $document->getField('__url')->getValue(), null !== $excerptMedia ? $excerptMedia : $teaserMedia, ['structureType' => $document->getField(StructureProvider::FIELD_STRUCTURE_TYPE)->getValue()]); } return $result; }
/** * Returns the search results for the given query. * * @param Request $request * * @return Response */ public function queryAction(Request $request) { $query = $this->getRequestParameter($request, 'q', true); $locale = $this->requestAnalyzer->getCurrentLocalization()->getLocale(); $webspace = $this->requestAnalyzer->getWebspace(); $queryString = ''; if (strlen($query) < 3) { $queryString .= '+("' . self::escapeDoubleQuotes($query) . '") '; } else { $queryValues = explode(' ', $query); foreach ($queryValues as $queryValue) { if (strlen($queryValue) > 2) { $queryString .= '+("' . self::escapeDoubleQuotes($queryValue) . '" OR ' . preg_replace('/([^\\pL\\s\\d])/u', '?', $queryValue) . '* OR ' . preg_replace('/([^\\pL\\s\\d])/u', '', $queryValue) . '~) '; } else { $queryString .= '+("' . self::escapeDoubleQuotes($queryValue) . '") '; } } } $hits = $this->searchManager->createSearch($queryString)->locale($locale)->index('page_' . $webspace->getKey() . '_published')->execute(); return $this->engine->renderResponse($webspace->getTemplate('search'), $this->parameterResolver->resolve(['query' => $query, 'hits' => $hits], $this->requestAnalyzer)); }