$TSFE->initFEuser();
$TSFE->initUserGroups();
$TSFE->sys_page = t3lib_div::makeInstance('t3lib_pageSelect');
$TSFE->rootLine = $TSFE->sys_page->getRootLine($pageId, '');
$TSFE->initTemplate();
$TSFE->getConfigArray();
$TSFE->includeTCA();
$TSFE->sys_language_uid = $languageId;
$solrConfiguration = tx_solr_Util::getSolrConfiguration();
#--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
# Building Suggest Query
$suggestQuery = NULL;
$q = trim(t3lib_div::_GP('term'));
$suggestQuery = t3lib_div::makeInstance('tx_solr_SuggestQuery', $q);
$suggestQuery->setUserAccessGroups(explode(',', $TSFE->gr_list));
$suggestQuery->setSiteHash(tx_solr_Util::getSiteHash($pageId));
$language = 0;
if ($TSFE->sys_language_uid) {
    $language = $TSFE->sys_language_uid;
}
$suggestQuery->addFilter('language:' . $language);
$suggestQuery->setOmitHeader();
$additionalFilters = t3lib_div::_GET('filters');
if (!empty($additionalFilters)) {
    $additionalFilters = json_decode($additionalFilters);
    foreach ($additionalFilters as $additionalFilter) {
        $suggestQuery->addFilter($additionalFilter);
    }
}
#--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
// Search
 /**
  * Performs special search initialization for the result plugin.
  *
  * @see	classes/pluginbase/tx_solr_pluginbase_PluginBase#initializeSearch()
  */
 protected function initializeSearch()
 {
     parent::initializeSearch();
     $this->initializeAdditionalFilters();
     // TODO check whether a search has been conducted already?
     if ($this->solrAvailable && (isset($this->piVars['q']) || $this->conf['search.']['allowEmptyQuery'])) {
         $this->piVars['q'] = trim($this->piVars['q']);
         if ($GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_solr.']['logging.']['query.']['searchWords']) {
             t3lib_div::devLog('received search query', 'tx_solr', 0, array($this->piVars['q']));
         }
         $query = t3lib_div::makeInstance('tx_solr_Query', $this->piVars['q']);
         if (isset($this->conf['search.']['query.']['minimumMatch']) && strlen($this->conf['search.']['query.']['minimumMatch'])) {
             $query->setMinimumMatch($this->conf['search.']['query.']['minimumMatch']);
         }
         if (!empty($this->conf['search.']['query.']['boostFunction'])) {
             $query->setBoostFunction($this->conf['search.']['query.']['boostFunction']);
         }
         if (!empty($this->conf['search.']['query.']['boostQuery'])) {
             $query->setBoostQuery($this->conf['search.']['query.']['boostQuery']);
         }
         if ($this->conf['enableDebugMode']) {
             $query->setDebugMode();
         }
         if ($this->conf['search.']['highlighting']) {
             $query->setHighlighting(TRUE, $this->conf['search.']['highlighting.']['fragmentSize']);
         }
         if ($this->conf['search.']['spellchecking']) {
             $query->setSpellchecking();
         }
         if ($this->conf['search.']['faceting']) {
             $query->setFaceting();
             $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['solr']['modifySearchQuery']['faceting'] = 'EXT:solr/classes/query/modifier/class.tx_solr_query_modifier_faceting.php:tx_solr_query_modifier_Faceting';
         }
         // access
         $query->setUserAccessGroups(explode(',', $GLOBALS['TSFE']->gr_list));
         $query->setSiteHash(tx_solr_Util::getSiteHash());
         $language = 0;
         if ($GLOBALS['TSFE']->sys_language_uid) {
             $language = $GLOBALS['TSFE']->sys_language_uid;
         }
         $query->addFilter('language:' . $language);
         foreach ($this->additionalFilters as $additionalFilter) {
             $query->addFilter($additionalFilter);
         }
         // sorting
         if ($this->conf['searchResultsViewComponents.']['sorting']) {
             $query->setSorting();
         }
         $flexformSorting = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'sortBy', 'sQuery');
         if (!empty($flexformSorting)) {
             $query->addQueryParameter('sort', $flexformSorting);
         }
         $this->query = $query;
     }
 }