/** * Helper for solr raw searches. * Deals with the language, meta_installation, section and visibility filters + solr sharding if any * @param array $params * @param string $requestType * @param bool $useDefaultFilters * @return array */ public static function rawSearch( $params, $requestType = 'php', $useDefaultFilters = true, $includeIsInvisible = true ) { eZDebug::accumulatorStart( __CLASS__ . '::' . __FUNCTION__, 'Merck' ); $findINI = eZINI::instance( 'ezfind.ini' ); $solrINI = eZINI::instance( 'solr.ini' ); $siteINI = eZINI::instance(); $currentLanguage = $siteINI->variable( 'RegionalSettings', 'ContentObjectLocale' ); // always use extended Dismax query handler when available if( isset($params['qt']) && $params['qt'] == 'ezpublish' ) $params['defType'] = 'edismax'; if ( $useDefaultFilters ) { if ( !isset( $params['fq'] ) ) $params['fq'] = ''; else $params['fq'] .= ' AND '; $params['fq'] .= implode( ' AND ', array( 'meta_installation_id_ms:' . eZSolr::installationID(), '(attr_offline_date_dt:"1970-01-01T01:00:00Z" OR attr_offline_date_dt:[NOW TO *])', '( meta_section_id_si:1 OR meta_section_id_si:3 )', ) ); if ($includeIsInvisible) { $params['fq'] .= ' AND ' . 'attr_is_invisible_' . ClusterTool::clusterIdentifier() . '_b:false'; } } if ( $findINI->variable( 'LanguageSearch', 'MultiCore' ) == 'enabled' ) { $languageMapping = $findINI->variable( 'LanguageSearch', 'LanguagesCoresMap' ); $shardMapping = $solrINI->variable( 'SolrBase', 'Shards' ); $fullSolrURI = $shardMapping[$languageMapping[$currentLanguage]]; } else { $fullSolrURI = $solrINI->variable( 'SolrBase', 'SearchServerURI' ); // Autocomplete search should be done in current language and fallback languages $validLanguages = array_unique( array_merge( LocaleTool::languageList(), array( $currentLanguage ) ) ); if( $useDefaultFilters ) $params['fq'] .= ' AND meta_language_code_ms:(' . implode( ' OR ', $validLanguages ) . ')'; } solrTool::solrStopWordsFilter( $params ); //excluding stopwords self::parseBooleanOperators( $params ); // translations for bookean operators $solrBase = new eZSolrBase( $fullSolrURI ); $result = $solrBase->rawSolrRequest( '/select', $params, $requestType ); if ( !$result ) self::addNoCacheHeaders(); eZDebug::accumulatorStop( __CLASS__ . '::' . __FUNCTION__ ); return $result; }
/** * @param string $clusterIdentifier * @throws eZDBException */ public static function fill($clusterIdentifier) { $configPath = "extension/ezoscar/bin/php/seo/config.json"; $cli = eZCLI::instance(); $config = file_get_contents($configPath); if(!$config) { $cli->output("Bad filepath for config file"); eZExecution::cleanExit(); } $config = json_decode($config, true); $db = MMDB::instance(); $rows = $db->arrayQuery(sprintf("SELECT * FROM mm_seo WHERE cluster_identifier = '%s'", $clusterIdentifier)); $progressBar = new ezcConsoleProgressbar( new ezcConsoleOutput(), count($rows), array( 'emptyChar' => ' ', 'barChar' => '=' ) ); $progressBar->start(); foreach($rows as $row) { if(!array_key_exists($clusterIdentifier, $config)) { continue; } $fq = $config[$clusterIdentifier][$row["application_identifier"]]["filters"]; $solrBase = new eZSolrBase(); $params = array( 'indent' => 'on', 'q' => '"'.$row['keyword'].'"', 'fq' => $fq, 'start' => 0, 'rows' => 0, 'fl' => '', 'qt' => 'ezpublish', 'explainOther' => '', 'hl.fl' => '', ); $results = $solrBase->rawSolrRequest('/select', $params); $num_found = $results['response']['numFound']; $db->query(sprintf("UPDATE mm_seo SET nb_results=%d, speciality_url='%s', keyword_url='%s' WHERE id=%d", $num_found, self::sanitize($row["speciality"]), self::sanitize($row["keyword"]), $row["id"])); $progressBar->advance(); } $progressBar->finish(); $cli->output(); }
/** * rawSolrRequest function * * @param base specifies the Solr server/shard to use * @param request the base request * @param parameters all parameters for the request * * @return array result as a PHP array */ public function rawSolrRequest( $baseURI, $request, $parameters = array() ) { $solr = new eZSolrBase( $baseURI ); return array( 'result' => $solr->rawSolrRequest( $request, $parameters ) ); }
$solr = new eZSolr(); $solrBase = new eZSolrBase(); $params = array( 'indent' => 'on', 'q' => '', 'fq' => 'meta_installation_id_ms:' . eZSolr::installationID() . ' AND meta_path_si:' . $top_node_id, 'start' => 0, 'rows' => 0, 'fl' => 'meta_main_url_alias_ms,meta_main_node_id_si,meta_name_t,meta_guid_ms,meta_language_code_ms', 'qt' => 'ezpublish', 'explainOther' => '', 'hl.fl' => '', ); $r = $solrBase->rawSolrRequest('/select', $params); $num_found = $r['response']['numFound']; $offset = 0; $params['rows'] = 100; while ( $offset < $num_found ) { $r = $solrBase->rawSolrRequest('/select', $params); foreach ( $r['response']['docs'] as $row ) { $n = new kezfinCleanNode($row); if ( !$n->node() ) // ghost $ghosts[] = $n; elseif ( $n->url_alias != $n->node()->urlAlias() ) // wrong path
private function advanced($args, $additional) { $parameters = array(); $limit = 10; // Solr default; TODO: see if we can get this from the Solr config instead // set the query string if (isset($args[3])) { $parameters['q'] = $args[3]; } else { echo "Query is required\n"; return; } // fields to list if (isset($args[4])) { $parameters['fl'] = $args[4]; } // fields to query if (isset($args[5])) { $parameters['fq'] = $args[5]; } // offset and limit if (isset($additional['offset'])) { $parameters['start'] = $additional['offset']; } if (isset($additional['limit'])) { $parameters['rows'] = $additional['limit']; $limit = $additional['limit']; } // output format if (isset($additional['output']) && $additional['output'] == 'xml') { $parameters['wt'] = 'xml'; } $showComplex = false; if (isset($additional['show-complex'])) { $showComplex = true; } $responseWriter = 'php'; // default eZFind Solr QueryResponseWriter if (isset($additional['output'])) { // xml, json, csv etc; // check /ezfind/java/solr/conf/solrconfig.xml for other valid/enabled queryResponseWriter $responseWriter = $additional['output']; } // run request directly to avoid hardcoded 'wt' parameter issue when using eZFunctionHandler $solr = new eZSolrBase(false); $search = $solr->rawSolrRequest('/select', $parameters, $responseWriter); if (isset($search['response']['numFound']) && $search['response']['numFound'] > 0 && !isset($additional['output'])) { $results = array(); $header = array(); $numFound = $search['response']['numFound']; $start = $search['response']['start']; if (count($search['response']['docs']) > 0) { foreach ($search['response']['docs'][0] as $index => $doc) { $header[] = $index; } $results[] = $header; $fieldListCount = count(explode(',', $parameters['fl'])); foreach ($search['response']['docs'] as $doc) { $result = array(); $resultCount = count($doc); foreach ($doc as $attribute) { if (is_array($attribute)) { if ($showComplex) { $result[] = implode('¦', $attribute); } else { $result[] = 'array()'; } } else { if (is_object($attribute)) { if ($showComplex) { $result[] = implode('¦', (array) $attribute); } else { $result[] = 'object()'; } } else { $result[] = $attribute; } } } // Not all docs return all fields queried for. // Fix the results table display by adding placeholders for those cases if ($resultCount !== $fieldListCount) { $diff = $fieldListCount - $resultCount; for ($i = 0; $i < $diff; $i++) { $result[] = 'no value'; } } $results[] = $result; } eep::printTable($results, "List ezfind results [{$limit}/{$start}/{$numFound}]"); } } else { if ($search && isset($additional['output']) && in_array($additional['output'], array('xml', 'csv'))) { echo $search[0]; } else { if ($search && isset($additional['output']) && $additional['output'] == 'json') { // TODO: eZ is json_decode'ing requests made with wt=json before passing back the result set // figure out a better way around that // // In the meantime echo json_encode($search) . "\n"; } else { echo "No results\n"; } } } }
/** * Returns autocomplete suggestions for given params * * @param mixed $args * @return array */ public static function autocomplete($args) { $result = array(); $findINI = eZINI::instance('ezfind.ini'); $solrINI = eZINI::instance('solr.ini'); $siteINI = eZINI::instance(); $currentLanguage = $siteINI->variable('RegionalSettings', 'ContentObjectLocale'); $input = isset($args[0]) ? mb_strtolower($args[0], 'UTF-8') : null; $limit = isset($args[1]) ? (int) $args[1] : (int) $findINI->variable('AutoCompleteSettings', 'Limit'); $facetField = $findINI->variable('AutoCompleteSettings', 'FacetField'); $params = array('q' => '*:*', 'json.nl' => 'arrarr', 'facet' => 'true', 'facet.field' => $facetField, 'facet.prefix' => $input, 'facet.limit' => $limit, 'facet.mincount' => 1); if ($findINI->variable('LanguageSearch', 'MultiCore') == 'enabled') { $languageMapping = $findINI->variable('LanguageSearch', 'LanguagesCoresMap'); $shardMapping = $solrINI->variable('SolrBase', 'Shards'); $fullSolrURI = $shardMapping[$languageMapping[$currentLanguage]]; } else { $fullSolrURI = $solrINI->variable('SolrBase', 'SearchServerURI'); // Autocomplete search should be done in current language and fallback languages $validLanguages = array_unique(array_merge($siteINI->variable('RegionalSettings', 'SiteLanguageList'), array($currentLanguage))); $params['fq'] = 'meta_language_code_ms:(' . implode(' OR ', $validLanguages) . ')'; } $solrBase = new eZSolrBase($fullSolrURI); $result = $solrBase->rawSolrRequest('/select', $params, 'json'); return $result['facet_counts']['facet_fields'][$facetField]; }
); $params = array( 'indent' => 'on', 'q' => '*:*', 'start' => 0, 'rows' => 1, 'fq' => 'meta_remote_id_ms:'.$remoteId, 'fl' => '',//implode(',', $fields), 'qt' => '', 'explainOther' => '', 'hl.fl' => '', ); $solrBase = new eZSolrBase(); $result = $solrBase->rawSolrRequest( '/select', $params, 'php' ); $result['response']['docs'][0]['attr_content_rating_'.$row['cluster_identifier'].'_f'] = $row['total']; $solrIndexationJob = new SolrIndexationJob(null); $solrIndexationJob->setAttribute('data', json_encode($result['response']['docs'][0])); $solrIndexationJob->store(); } $mdb->query( sprintf( 'UPDATE mm_rating_remote SET to_reindex = 0 WHERE remote_id = "%s"', $remoteId ) ); }
/** * Returns autocomplete suggestions for given params * * @param mixed $args * @return array */ public static function autocomplete($args) { $result = array(); $findINI = eZINI::instance('ezfind.ini'); // Only make calls if explicitely enabled if ($findINI->hasVariable('AutoCompleteSettings', 'AutoComplete') && $findINI->variable('AutoCompleteSettings', 'AutoComplete') === 'enabled') { $solrINI = eZINI::instance('solr.ini'); $siteINI = eZINI::instance(); $currentLanguage = $siteINI->variable('RegionalSettings', 'ContentObjectLocale'); $input = isset($args[0]) ? mb_strtolower($args[0], 'UTF-8') : null; $limit = isset($args[1]) ? (int) $args[1] : (int) $findINI->variable('AutoCompleteSettings', 'Limit'); $facetField = $findINI->variable('AutoCompleteSettings', 'FacetField'); $facetMethod = $findINI->variable('AutoCompleteSettings', 'FacetMethod'); $params = array('q' => '*:*', 'rows' => 0, 'json.nl' => 'arrarr', 'facet' => 'true', 'facet.field' => $facetField, 'facet.prefix' => $input, 'facet.limit' => $limit, 'facet.method' => $facetMethod, 'facet.mincount' => 1); if ($findINI->variable('LanguageSearch', 'MultiCore') == 'enabled') { $languageMapping = $findINI->variable('LanguageSearch', 'LanguagesCoresMap'); $shardMapping = $solrINI->variable('SolrBase', 'Shards'); $fullSolrURI = $shardMapping[$languageMapping[$currentLanguage]]; } else { $fullSolrURI = $solrINI->variable('SolrBase', 'SearchServerURI'); // Autocomplete search should be done in current language and fallback languages $validLanguages = array_unique(array_merge($siteINI->variable('RegionalSettings', 'SiteLanguageList'), array($currentLanguage))); $params['fq'] = 'meta_language_code_ms:(' . implode(' OR ', $validLanguages) . ')'; } //build the query part for the subtree limitation if (isset($args[2]) && (int) $args[2]) { if (isset($params['fq']) && $params['fq']) { $params['fq'] .= ' AND '; } $params['fq'] .= eZSolr::getMetaFieldName('path') . ':' . (int) $args[2]; } //build the query part for the class limitation if (isset($args[3]) && $args[3]) { if (isset($params['fq']) && $params['fq']) { $params['fq'] .= ' AND '; } $classes = explode(',', $args[3]); $classQueryParts = array(); foreach ($classes as $class) { if (!is_numeric($class)) { if ($class = eZContentClass::fetchByIdentifier($class)) { $classQueryParts[] = eZSolr::getMetaFieldName('contentclass_id') . ':' . $class->attribute('id'); } } else { $classQueryParts[] = eZSolr::getMetaFieldName('contentclass_id') . ':' . $class; } } $classQueryParts = implode(' OR ', $classQueryParts); $params['fq'] .= '(' . $classQueryParts . ')'; } $solrBase = new eZSolrBase($fullSolrURI); $result = $solrBase->rawSolrRequest('/select', $params, 'json'); return $result['facet_counts']['facet_fields'][$facetField]; } else { // not enabled, just return an empty array return array(); } }