/** * 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'; } }
/** * 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); } }
/** * 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; }
/** * 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); } }
/** * 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); }
/** * 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); }
/** * 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('*:*'); }
/** * 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; }
/** * @return int */ public function getResultsPerPage() { return $this->usedQuery->getResultsPerPage(); }
/** * Initializes the search component. * * */ public function initializeSearchComponent() { if ($this->searchConfiguration['spellchecking']) { $this->query->setSpellchecking(); } }
/** * 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; }
/** * 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)); }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * @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(); } }