<? // 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 ?>