This Confluence has been LDAP enabled, if you are an ASF Committer, please use your LDAP Credentials to login. Any problems file an INFRA jira ticket please.

Page tree
Skip to end of metadata
Go to start of metadata
<?
	
	// Change this to your server
	
	define('SOLR_META_QUERY', '127.0.0.1:8080');
	
// VERSION SolrQuery  0.1
// Written by Brian Lucas, use any which way you see fit.
//
// DESCRIPTION
// 
//   This class runs an external fulltext search on Solr
// 	Example Usage:

/*
		$query = new SolrQuery;
	
		$query->language_id = $this->language_id;
		$query->lowerdate = $day_3neg;
		$query->upperdate = $day_3pos;
		$query->limit = 10;
		$query->group_id = 1;

		$results = $query->runQuery($titlekeywords);
		print_r($results);
*/		

class SolrQuery {




	// All of these init variables are yours to define, these are just examples
	var $language_id = 0;
	var $lowerdate = 0; // lower bound of date range
	var $upperdate = 0; // upper bound of date range
	var $limit = 100; // number of result to return
	var $min_score = 0.5; // only add these values if they are above this score
	var $httppost=false; // set to true to send via HTTP POST (form) instead of HTTP GET (url)
	var $debug=false; // turn on debugging mode (not fully complete)
	
	// Reset or initialize variables
	function init() {
		$this->language_id = 0;
		$this->lowerdate = 0;
		$this->upperdate = 0;
		$this->limit = 100;
		$this->min_score = 0.0; // only add these values if they are above this score
		$this->httppost=false;
		
	} 
	// Example of a query -- different queries with their own logic should be made as separate functions
	function runQuery($titlekeywords) {
		
		$query = $this->setUpQuery();

		// remove spaces
		// change to mb_eregi_replace if using multibyte
		$keywords = preg_replace('@[\s]+@',' ', trim($titlekeywords));
		$string = "+(title:($titlekeywords)) ";
		$query.=$string;
		 
		
		$query = trim($query);
		
		$data = $this->fetchResults($query);
		$results = $this->handleResponse($data);
		
		return $results;
	} // end function sortQuery
	
	
	// Use this to set up default logic that will apply to all queries
	function setUpQuery() {
		$query = "";
		
		// Set up your basic fields here that will be used in the query
		if ($this->language_id >0) $query.="+language_id:$this->language_id ";
		if ($this->group_id >0) $query.="+group_id:$this->group_id ";

		$lowerdate = "*";
		$upperdate = "*";
				
		if ($this->lowerdate >0) $lowerdate = $this->lowerdate;
		if ($this->upperdate >0) $upperdate = $this->upperdate;

		if (($lowerdate!="*") || ($upperdate != "*")) {
			$query.="+lucene_date:[".$lowerdate." TO ".$upperdate."] ";
		}
		return $query;
	}
	
	// Handle the response from the server and transform it into useful fields
	function handleResponse($data) {
		if ($data) {
		
			$xml = simplexml_load_string($data );

			
			$results = array();
			foreach ($xml->result->doc as $story) {
				$xmlarray = array();
				
				try{
					foreach ($story as $item) {
						$name = $item->attributes()->name;
						$value = $item;
										

				
						$xmlarray["$name"] = "$value";

					} // end foreach
				} catch (Exception $e) {
					echo 'Problem handling XML array.'; 
				}

				// 
				if ($this->debug) echo "checking if ".$xmlarray['score']." > ".$this->min_score;
				if ($xmlarray['score'] > $this->min_score) $results[] = $xmlarray;


			} // end foreach

		} else {
			$results=false;
		} // end if / else data

		 
		return $results;
	}
	
	// Send the query to the server
	function fetchResults($query) {
	
		if ($this->debug) echo "parsing string $query";

		$url = "http://".SOLR_META_QUERY."/solr/select";

		$querystring = "stylesheet=&q=".trim(urlencode($query))."&version=2.1&start=0&rows=".$this->limit."&fl=*+score&qt=standard";

		if (!$this->httppost) $selecturl = "/?$querystring";
		$url .= $selecturl;
		
		$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
		$header[] = "Accept-Language: en-us,en;q=0.5";
		$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";


		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url); // set url to post to
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_ENCODING,"");		
		curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,10);
		curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, 0);

		if ($this->httppost) {
			curl_setopt($ch, CURLOPT_POST, 1 );
			curl_setopt($ch, CURLOPT_POSTFIELDS,$querystring);

		}
		
		if ($this->debug) echo "\r\nRetrieving <A HREF='$url' target=_BLANK>$url</a>...\r\n";


		$data = curl_exec($ch);

		
		if (curl_errno($ch)) {
			logger "setting results to false, error";
			print curl_error($ch);
			$results=false;
		} else {
			curl_close($ch);
			if ( strstr ( $data, '<status>0</status>')) {
//				Logger::decho("setting to true");
				$results = $data;
			}
		} 
		if ($this->debug) echo $data;
		return $results;
	}
	
	
} // end class


?>
  • No labels