PHP客戶端 solr查詢具體實現
阿新 • • 發佈:2019-01-30
Sorl簡介
Solr是一個基於Lucene的Java搜尋引擎伺服器。Solr 提供了層面搜尋、命中醒目顯示並且支援多種輸出格式(包括 XML/XSLT 和 JSON 格式)。它易於安裝和配置,而且附帶了一個基於 HTTP 的管理介面。Solr已經在眾多大型的網站中使用,較為成熟和穩定。Solr 包裝並擴充套件了 Lucene,所以Solr的基本上沿用了Lucene的相關術語。更重要的是,Solr 建立的索引與 Lucene 搜尋引擎庫完全相容。通過對Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使用構建到其他 Lucene 應用程式中的索引。此外,很多 Lucene 工具(如Nutch、 Luke)也可以使用Solr 建立的索引。
sorl在php中的具體實現步驟
- 寫一個solr搜尋操作基礎類
- 實現具體呼叫操作類
- 分析查詢地址,拼湊查詢地址
1.寫一個solr搜尋操作基礎類
將對solr的操作進行封裝:
/*****************************************************
* 檔名: solr.class.php
* 功能: solr搜尋操作基礎類
* 版本: 1.0
* 日期: 2016-06-15
* 作者: JoeXiong
* 版權: Copyright © 2016 https://github.com/JoeXiong All Rights Reserved
*/
class solr {
private $_url;
private $_core_name;
private $_wt;
/**
* 建構函式
* @param string $url
* @param string $core_name
* @param string $wt 0:php 1:json 2:xml
*/
public function __construct($url, $core_name, $wt=0) {
$this->_url = $url;
$this ->_core_name = $core_name;
if(0===$wt) {
$wt = 'php';
} elseif(1===$wt) {
$wt = 'json';
} else {
$wt = 'xml';
}
$this->_wt = $wt;
}
public function curl_get($url, $time_out=1) {
if(0 === stripos($url, 'http:')){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);
$data = curl_exec($ch);
$res[0] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$res[1] = $data;
curl_close($ch);
return $res;
} else {
echo 'ERROR URL';
exit();
}
}
public function curl_post($url, $vars) {
if(0 === stripos($url, 'http:')){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-
type:application/json'));
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
$data = curl_exec($ch);
$res[0] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$res[1] = $data;
curl_close($ch);
return $res;
} else {
echo 'ERROR URL';
exit();
}
}
/**
* 搜尋引擎狀態
*/
public function ping() {
return $this->curl_get($this->_url.$this->_core_name.
'/admin/ping?wt='.$this->_wt);
}
/**
* 獲得分詞結果
* @param string $field_value
* @param string $field_type
* @return mixed
*/
public function analysis($field_value, $field_type) {
return $this->curl_get($this->_url.
$this->_core_name.
$this->_wt.
'&analysis.fieldvalue='.
urlencode($field_value).
'&analysis.fieldtype='.$field_type);
}
/**
* get function
* @return Ambigous <unknown, string>
*/
public function getUrl() {
return $this->_url;
}
public function getCoreName() {
return $this->_core_name;
}
public function getWt() {
return $this->_wt;
}
/**
* set function
*/
public function setUrl($url) {
$this->_url = $url;
}
public function setCoreName($core_name) {
$this->_core_name = $core_name;
}
public function setWt($wt) {
$this->_wt = $wt;
}
}
?>
2. 實現具體呼叫操作類
class solrsearcher extends solr {
public function __construct($url, $core_name, $wt) {
parent::__construct($url, $core_name, $wt);
}
public function q($query, $time_out=1) {
return self::curl_get(self::getUrl().self::getCoreName().'/select?'.$query,
$time_out);
}
/**
* solr查詢,返回查詢結果陣列
* @param : string $query 查詢字串
* @param : int $start 起始處
* @param : int $rows 返回條數
* @param : string $wt =>預設返回資料格式為json
* @return : array | boolean
* */
public function solrQuery($query="q=*:*", $start=0, $rows=64, $wt="json"){
try {
$query .= "&wt=".$wt . "&start=".$start . "&rows=".$rows;
$rejsondata = self::q($query);
if($rejsondata[0]==200){
return json_decode($rejsondata[1], true);
}else{
return FALSE;
}
} catch (Exception $e) {
throw $e;
}
}
}
3.分析查詢地址,拼湊查詢地址
這裡直接用的是q查詢,看q=keyword%3At*&wt=json&indent=true,需要拼湊的欄位就行
public function solrKeywordAjax()
{
require_once (_SITE_ROOT_.'/config/solr.config.php');
$searchk = isset($_POST['searchk'])?addslashes(trim($_POST['searchk'])):NULL;
$solrobj = new solrsearcher($solrserver['s1']['url'], $s1corename['10003']['corename'], 1);
//solr search BEGIN////////////////////////////////////////////////////
//$query = q=urlencode(pinyin:*$searchk*).&sort=urlencode($sort)
//判斷值含有漢字 -- Y:keyword N:pinyin
$flag = true; //搜尋方式標記 true:keyword false:pinyin
if($searchk != null){
if (preg_match("/([\x81-\xfe][\x40-\xfe])/", $searchk, $match)) {
$q = 'keyword:'.$searchk.'*';
} else {
$q = 'pinyin:'.strtolower($searchk).'*';
$flag = false;
}
}else{
echo json_encode(array());
exit();
}
$sort = 'weight desc';
$query = '&q='.urlencode($q).'&sort='.urlencode($sort);
//顯示條數
$start = 0;
$rows = 10;
//返回查詢的資料
$searchdataarr = $solrobj->solrQuery($query, $start, $rows);
//solr search END////////////////////////////////////////////////////////
}