PHP客户端 solr查询具体实现
2016-06-15 17:19
786 查看
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.分析查询地址,拼凑查询地址
去服务器搭建好的solr先模拟请求,会有请求地址,比如我模拟出来我请求的地址是:http://192.0.0.8:8083/solr/keyword/select?q=keyword%3At*&wt=json&indent=true
这里直接用的是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//////////////////////////////////////////////////////// }
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- 微信搜一搜迈出新的一步,好戏来了
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- rem : web app适配的秘密武器
- jquery高级应用之Deferred对象
- php7 读取php.ini[4]
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项