Example #1
0
 /**
  * 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);
 }
Example #2
0
 /**
  * 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);
 }
Example #3
0
 /**
  * {@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;
 }
Example #4
0
 /**
  * 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));
 }