/**
  * Initializes the search component.
  *
  * Sets the debug query parameter
  *
  */
 public function initializeSearchComponent()
 {
     $solrConfiguration = Util::getSolrConfiguration();
     if ($solrConfiguration->getEnabledDebugMode()) {
         $this->query->setDebugMode();
     }
 }
 /**
  * Initializes the search component.
  *
  *
  */
 public function initializeSearchComponent()
 {
     if ($this->searchConfiguration['results.']['showDocumentScoreAnalysis']) {
         $this->query->setDebugMode();
         $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['solr']['modifyResultDocument']['scoreAnalysis'] = 'ApacheSolrForTypo3\\Solr\\ResultDocumentModifier\\ScoreAnalyzer';
         $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['solr']['modifySearchForm']['queryAnalysis'] = 'ApacheSolrForTypo3\\Solr\\Plugin\\Results\\QueryAnalyzerFormModifier';
     }
 }
 /**
  * Initializes the search component.
  *
  *
  */
 public function initializeSearchComponent()
 {
     if ($this->searchConfiguration['results.']['siteHighlighting']) {
         $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['solr']['modifyResultDocument']['siteHighlighter'] = 'ApacheSolrForTypo3\\Solr\\ResultDocumentModifier\\SiteHighlighter';
     }
     if ($this->searchConfiguration['results.']['resultsHighlighting']) {
         $this->query->setHighlighting(true, $this->searchConfiguration['results.']['resultsHighlighting.']['fragmentSize']);
         $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['solr']['modifyResultDocument']['highlighting'] = 'ApacheSolrForTypo3\\Solr\\ResultDocumentModifier\\DocumentHighlighter';
     }
 }
Exemple #4
0
 /**
  * Initializes the search component.
  *
  * Sets the sorting query parameters
  *
  */
 public function initializeSearchComponent()
 {
     if (!empty($this->searchConfiguration['query.']['sortBy'])) {
         $this->query->addQueryParameter('sort', $this->searchConfiguration['query.']['sortBy']);
     }
     $solrGetParameters = GeneralUtility::_GET('tx_solr');
     if (!empty($this->searchConfiguration['sorting']) && !empty($solrGetParameters['sort']) && preg_match('/^([a-z0-9_]+ (asc|desc)[, ]*)*([a-z0-9_]+ (asc|desc))+$/i', $solrGetParameters['sort'])) {
         $sortHelper = GeneralUtility::makeInstance('ApacheSolrForTypo3\\Solr\\Sorting', $this->searchConfiguration['sorting.']['options.']);
         $sortField = $sortHelper->getSortFieldFromUrlParameter($solrGetParameters['sort']);
         $this->query->setSorting($sortField);
     }
 }
Exemple #5
0
 /**
  * Modifies the given query and adds the parameters necessary for faceted
  * search.
  *
  * @param Query $query The query to modify
  * @return Query The modified query with faceting parameters
  */
 public function modifyQuery(Query $query)
 {
     $query->setFaceting();
     $this->buildFacetingParameters();
     $this->addFacetQueryFilters();
     foreach ($this->facetParameters as $facetParameter => $value) {
         $query->addQueryParameter($facetParameter, $value);
     }
     foreach ($this->facetFilters as $filter) {
         $query->addFilter($filter);
     }
     return $query;
 }
Exemple #6
0
 /**
  * Constructor
  *
  */
 public function __construct()
 {
     parent::__construct('');
     // todo, is this really needed? Because it is not used from outside, can we remove it?
     $this->configuration = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_solr.']['moreLikeThis.'];
     $this->setQueryType('mlt');
 }
 /**
  * Initializes the search component.
  *
  * Sets minimum match, boost function, and boost query.
  *
  */
 public function initializeSearchComponent()
 {
     if (!empty($this->searchConfiguration['query.']['minimumMatch'])) {
         $this->query->setMinimumMatch($this->searchConfiguration['query.']['minimumMatch']);
     }
     if (!empty($this->searchConfiguration['query.']['boostFunction'])) {
         $this->query->setBoostFunction($this->searchConfiguration['query.']['boostFunction']);
     }
     if (!empty($this->searchConfiguration['query.']['boostQuery'])) {
         $this->query->setBoostQuery($this->searchConfiguration['query.']['boostQuery']);
     }
     if (!empty($this->searchConfiguration['query.']['boostQuery.'])) {
         $boostQueries = array();
         $boostConfiguration = $this->searchConfiguration['query.']['boostQuery.'];
         foreach ($boostConfiguration as $query) {
             $boostQueries[] = $query;
         }
         $this->query->setBoostQuery($boostQueries);
     }
 }
Exemple #8
0
 /**
  * Processes a query and its response after searching for that query.
  *
  * @param Query $query The query that has been searched for.
  * @param \Apache_Solr_Response $response The response for the last query.
  */
 public function processResponse(Query $query, \Apache_Solr_Response $response)
 {
     $urlParameters = GeneralUtility::_GP('tx_solr');
     $keywords = $query->getKeywords();
     $filters = isset($urlParameters['filter']) ? $urlParameters['filter'] : array();
     if (empty($keywords)) {
         // do not track empty queries
         return;
     }
     $keywords = $this->sanitizeString($keywords);
     $sorting = '';
     if (!empty($urlParameters['sort'])) {
         $sorting = $this->sanitizeString($urlParameters['sort']);
     }
     $configuration = Util::getSolrConfiguration();
     if ($configuration['search.']['frequentSearches.']['useLowercaseKeywords']) {
         $keywords = strtolower($keywords);
     }
     $ipMaskLength = (int) $configuration['statistics.']['anonymizeIP'];
     $insertFields = array('pid' => $GLOBALS['TSFE']->id, 'root_pid' => $GLOBALS['TSFE']->tmpl->rootLine[0]['uid'], 'tstamp' => $GLOBALS['EXEC_TIME'], 'language' => $GLOBALS['TSFE']->sys_language_uid, 'num_found' => $response->response->numFound, 'suggestions_shown' => is_object($response->spellcheck->suggestions) ? (int) get_object_vars($response->spellcheck->suggestions) : 0, 'time_total' => $response->debug->timing->time, 'time_preparation' => $response->debug->timing->prepare->time, 'time_processing' => $response->debug->timing->process->time, 'feuser_id' => (int) $GLOBALS['TSFE']->fe_user->user['uid'], 'cookie' => $GLOBALS['TSFE']->fe_user->id, 'ip' => $this->applyIpMask(GeneralUtility::getIndpEnv('REMOTE_ADDR'), $ipMaskLength), 'page' => (int) $urlParameters['page'], 'keywords' => $keywords, 'filters' => serialize($filters), 'sorting' => $sorting, 'parameters' => serialize($response->responseHeader->params));
     $GLOBALS['TYPO3_DB']->exec_INSERTquery('tx_solr_statistics', $insertFields);
 }
Exemple #9
0
 /**
  * Generates a html link - an anchor tag.
  *
  * TODO currently everything in $additionalQueryParameters is prefixed with tx_solr,
  * allow arbitrary parameters, too (either filter them out or introduce a new 4th parameter)
  *
  * @param string $linkText Link Text
  * @param array $additionalQueryParameters Additional query parameters
  * @param array $typolinkOptions Typolink Options
  * @return string A html link
  */
 public function getQueryLink($linkText, array $additionalQueryParameters = array(), array $typolinkOptions = array())
 {
     $queryParameters = array_merge($this->getPluginParameters(), $additionalQueryParameters);
     $queryParameters = $this->removeUnwantedUrlParameters($queryParameters);
     $queryGetParameter = '';
     $keywords = $this->query->getKeywords();
     if (!empty($keywords)) {
         $queryGetParameter = '&q=' . $keywords;
     }
     $linkConfiguration = array('useCacheHash' => false, 'no_cache' => false, 'parameter' => $this->linkTargetPageId, 'additionalParams' => $queryGetParameter . \TYPO3\CMS\Core\Utility\GeneralUtility::implodeArrayForUrl('', array($this->prefix => $queryParameters), '', true) . $this->getUrlParameters());
     // merge linkConfiguration with typolinkOptions
     $linkConfiguration = array_merge($linkConfiguration, $typolinkOptions);
     return $this->contentObject->typoLink($linkText, $linkConfiguration);
 }
Exemple #10
0
 /**
  * SuggestQuery constructor.
  *
  * @param string $keywords
  * @param TypoScriptConfiguration $solrConfiguration
  */
 public function __construct($keywords, $solrConfiguration = null)
 {
     $keywords = (string) $keywords;
     if ($solrConfiguration == null) {
         $solrConfiguration = Util::getSolrConfiguration();
     }
     parent::__construct('', $solrConfiguration);
     $this->configuration = $solrConfiguration->getObjectByPathOrDefault('plugin.tx_solr.suggest.', []);
     if (!empty($this->configuration['treatMultipleTermsAsSingleTerm'])) {
         $this->prefix = $this->escape($keywords);
     } else {
         $matches = array();
         preg_match('/^(:?(.* |))([^ ]+)$/', $keywords, $matches);
         $fullKeywords = trim($matches[2]);
         $partialKeyword = trim($matches[3]);
         $this->setKeywords($fullKeywords);
         $this->prefix = $this->escape($partialKeyword);
     }
     $this->setAlternativeQuery('*:*');
 }
Exemple #11
0
 /**
  * Modifies the given query and adds the parameters necessary
  * for result grouping.
  *
  * @param Query $query The query to modify
  * @return Query The modified query with grouping parameters
  */
 public function modifyQuery(Query $query)
 {
     $query->setGrouping();
     $query->setNumberOfResultsPerGroup($this->findHighestGroupResultsLimit());
     if (!empty($this->groupingConfiguration['numberOfGroups'])) {
         $query->setNumberOfGroups($this->groupingConfiguration['numberOfGroups']);
     }
     $configuredGroups = $this->groupingConfiguration['groups.'];
     foreach ($configuredGroups as $groupName => $groupConfiguration) {
         if (isset($groupConfiguration['field'])) {
             $query->addGroupField($groupConfiguration['field']);
         } elseif (isset($groupConfiguration['query'])) {
             $query->addGroupQuery($groupConfiguration['query']);
         }
         if (isset($groupConfiguration['sortBy'])) {
             $query->addGroupSorting($groupConfiguration['sortBy']);
         }
     }
     return $query;
 }
Exemple #12
0
 /**
  * @return int
  */
 public function getResultsPerPage()
 {
     return $this->usedQuery->getResultsPerPage();
 }
 /**
  * Initializes the search component.
  *
  *
  */
 public function initializeSearchComponent()
 {
     if ($this->searchConfiguration['spellchecking']) {
         $this->query->setSpellchecking();
     }
 }
Exemple #14
0
 /**
  * Enables the query's debug mode to get more detailed information.
  *
  * @param Query $query The query to modify
  * @return Query The modified query with enabled debugging mode
  */
 public function modifyQuery(Query $query)
 {
     $query->setDebugMode(true);
     return $query;
 }
Exemple #15
0
 /**
  * Initializes the search component.
  *
  *
  */
 public function initializeSearchComponent()
 {
     $allowedSites = Util::resolveSiteHashAllowedSites($GLOBALS['TSFE']->id, $this->searchConfiguration['query.']['allowedSites']);
     $this->query->setSiteHashFilter($allowedSites);
     $this->query->setUserAccessGroups(explode(',', $GLOBALS['TSFE']->gr_list));
 }
Exemple #16
0
 /**
  * Gets the user's query term and cleans it so that it can be used in
  * templates f.e.
  *
  * @return string The cleaned user query.
  */
 public function getCleanUserQuery()
 {
     $userQuery = $this->getRawUserQuery();
     if (!is_null($userQuery)) {
         $userQuery = Query::cleanKeywords($userQuery);
     }
     // escape triple hashes as they are used in the template engine
     // TODO remove after switching to fluid templates
     $userQuery = Template::escapeMarkers($userQuery);
     return $userQuery;
 }
Exemple #17
0
 /**
  * Initializes additional filters configured through TypoScript and
  * Flexforms for use in regular queries and suggest queries.
  *
  * @param Query $query
  * @return void
  */
 protected function initializeAdditionalFilters(Query $query)
 {
     $additionalFilters = array();
     if (!empty($this->conf['search.']['query.']['filter.'])) {
         // special filter to limit search to specific page tree branches
         if (array_key_exists('__pageSections', $this->conf['search.']['query.']['filter.'])) {
             $query->setRootlineFilter($this->conf['search.']['query.']['filter.']['__pageSections']);
             unset($this->conf['search.']['query.']['filter.']['__pageSections']);
         }
         // all other regular filters
         foreach ($this->conf['search.']['query.']['filter.'] as $filterKey => $filter) {
             if (!is_array($this->conf['search.']['query.']['filter.'][$filterKey])) {
                 if (is_array($this->conf['search.']['query.']['filter.'][$filterKey . '.'])) {
                     $filter = $this->cObj->stdWrap($this->conf['search.']['query.']['filter.'][$filterKey], $this->conf['search.']['query.']['filter.'][$filterKey . '.']);
                 }
                 $additionalFilters[$filterKey] = $filter;
             }
         }
     }
     // flexform overwrites _all_ filters set through TypoScript
     $flexformFilters = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'filter', 'sQuery');
     if (!empty($flexformFilters)) {
         $additionalFilters = GeneralUtility::trimExplode('|', $flexformFilters);
     }
     $this->additionalFilters = $additionalFilters;
 }
Exemple #18
0
 /**
  * Enables the query's elevation mode.
  *
  * @param Query $query The query to modify
  * @return Query The modified query with enabled elevation mode
  */
 public function modifyQuery(Query $query)
 {
     $configuration = Util::getSolrConfiguration();
     $query->setQueryElevation($configuration->getSearchElevation(), $configuration->getSearchElevationForceElevation(), $configuration->getSearchElevationMarkElevatedResults());
     return $query;
 }
Exemple #19
0
 /**
  * Enables the query's elevation mode.
  *
  * @param Query $query The query to modify
  * @return Query The modified query with enabled elevation mode
  */
 public function modifyQuery(Query $query)
 {
     $configuration = Util::getSolrConfiguration();
     $query->setQueryElevation($configuration['search.']['elevation'], $configuration['search.']['elevation.']['forceElevation'], $configuration['search.']['elevation.']['markElevatedResults']);
     return $query;
 }
Exemple #20
0
 /**
  * @test
  * @depends settingGroupingTrueActivatesGrouping
  */
 public function settingGroupingFalseDeactivatesGrouping(Query $query)
 {
     $query->setGrouping(false);
     $queryParameters = $query->getQueryParameters();
     foreach ($queryParameters as $queryParameter => $value) {
         $this->assertTrue(!GeneralUtility::isFirstPartOfStr($queryParameter, 'group'), 'Query contains grouping parameter "' . $queryParameter . '"');
     }
 }
 /**
  * Initializes additional filters configured through TypoScript and
  * Flexforms for use in regular queries and suggest queries.
  *
  * @param Query $query
  * @return void
  */
 protected function applyPageSectionsRootLineFilter(Query $query)
 {
     $searchQueryFilters = $this->typoScriptConfiguration->getSearchQueryFilterConfiguration();
     if (count($searchQueryFilters) <= 0) {
         return;
     }
     // special filter to limit search to specific page tree branches
     if (array_key_exists('__pageSections', $searchQueryFilters)) {
         $query->setRootlineFilter($searchQueryFilters['__pageSections']);
         $this->typoScriptConfiguration->removeSearchQueryFilterForPageSections();
     }
 }