PHP-从零开始使用Solr搜索引擎服务(下)
前言:
原文地址:
http://www.cnblogs.com/JimmyBright/p/7156085.html
前面在配置完成Solr服务之后,在浏览器上可以打开Solr的管理界面,这个界面几乎包含了Solr的所有功能,如何反应到我们的PHP里边呢?很多人或许查到需要再安装一个php-solr-client,用于php和java的solr服务器通信,研究了半天没弄明白怎么做,反正是很麻烦而且似乎很多余。
1:思路:
注意看Solr的管理界面上,你或许有以下发现。
上面框框中有一个url地址,把这个地址复制,然后放在浏览器的地址栏,果然如所想一样,返回了结果集。市面上有很多Solr教程,厚厚的一本书,里边讲解肯定很全面,我们没时间看,怎么能最快解决问题就怎么做。
只要浏览器上能出结果,很自然就想到,Solr这是对外公开了一套api嘛,我们完全可以用php的curl做到这一点,浏览器能做到的,curl肯定也可以。
这里写了一个简单的CURL请求方法
private function getCurl($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl) ;
curl_close($curl);
return json_decode($data,true);
}
实验一下,和预期的结果完全一样,所以下面我们就用这个思路去对接php和solr。
2:使用PHP操作Solr查询
对应Solr管理界面上的Query栏目下,我们要搞清楚这些字段的意义,然后就能用php操作整个搜索过程了
图中q、fq、sort、fl、df等,这些字段都是搜索用的字段,我们只要搞清楚这些字段意义就可以写php代码了。
字段的意义网上有很多,这个链接都有介绍了
http://blog.csdn.net/zmken497300/article/details/52817825 3:使用PHP操作Solr建立索引
搜索已经有思路去解决了,还有一个关键的问题要解决,Solr是对关联的数据库建立索引,再对索引进行搜索
。很显然数据库任何时间都会变更,所以要让Solr能不间断的重建索引才能搜索到最新的结果集。
管理界面中有一个Dataimport选项,点开可以手动重建索引,我们没有看到类似Query上的查询有一个
URL,我们很希望有这一个东西,这样就能用curl,程序自动重建索引。
按照前面的思路,我们有理由相信,Solr肯定已经有这样的api。
把浏览器设置调试模式
当我点下Execute按钮的时候,看到下面网络请求果然发出了一条url,复制这个url到浏览器,和想象的一样,自动重建了索引并返回了结果打印到浏览器上。
到此为止,已经基本都解决了PHP操作Solr的技术问题,可以预见,完成一个简单的搜索功能,不会再出现技术问题了吧。
下面附上一段PHP代码,操作Solr
class SolrClient
{
public $query_url='';
public $import_url='';
private $q='q=*:*';
private $fq='';
private $sort='';
private $rows='rows=10&start=0';
private $fl='';
private $raw_query='';
public $hl_str=''; function __construct($core)
{
$host=Yii::$app->params['solr_host'];
$this->query_url=sprintf("%s/solr/%s/select?indent=on&wt=json&",$host,$core);
$this->import_url=sprintf("%s/solr/%s/dataimport?indent=on&wt=json&command=full-import&verbose=false&clean=true&commit=true&optimize=false&core=crm&name=dataimport",$host,$core);
}
public function setQuery(array $query){
$q_str=[];
foreach ($query as $k=>$v) {
if(!empty($v)){
$q_str[]=urlencode($k).':'.urlencode($v);
}
}
if(!empty($q_str)){
$this->q='q='.implode(urlencode(' OR '),$q_str);
}
}
public function setFilterQuery(array $query){
$q_str=[];
foreach ($query as $k=>$v) {
$q_str[]='fq='.urlencode($k).':'.urlencode($v);
}
$this->fq=implode('&',$q_str);
}
public function setRows($start,$rows){
$this->rows=sprintf('rows=%s&start=%s',$rows,$start);
}
public function setHighLight(array $fields,$hlpre,$hlpost){
$hl_fl=[];
foreach ($fields as $field) {
$hl_fl[]=$field;
}
$this->hl_str=sprintf("hl.fl=%s&hl.simple.post=%s&hl.simple.pre=%s&hl=on",implode(',',$hl_fl),urlencode($hlpost),urlencode($hlpre));
}
public function setFl(array $fields){
$hl_fl=[];
foreach ($fields as $field) {
$hl_fl[]=$field;
}
$this->fl='fl='.implode(',',$hl_fl);
}
public function setRawQuery(array $params){
$raw=[];
foreach ($params as $k=>$v) {
$raw[]=$k.'='.$v;
}
$this->raw_query=implode('&',$raw);
}
public function sortQuery($field,$sort){
$this->sort= "sort=".$field.urlencode(' ').$sort;
} /**
* 搜索查询
* @return mixed
*/
public function search(){
$this->query_url.=$this->q;
!empty($this->fq)&&$this->query_url.='&'.$this->fq;
!empty($this->sort)&&$this->query_url.='&'.$this->sort;
!empty($this->rows)&&$this->query_url.='&'.$this->rows;
!empty($this->fl)&&$this->query_url.='&'.$this->fl;
!empty($this->raw_query)&&$this->query_url.='&'.$this->raw_query;
!empty($this->hl_str)&&$this->query_url.='&'.$this->hl_str;
return $this->getCurl($this->query_url);
} /**
* 全量重构索引
* @return mixed
*/
public function index(){
return $this->getCurl($this->import_url);
}
private function getCurl($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl) ;
curl_close($curl);
return json_decode($data,true);
} }
search方法就是用来发起CURL的搜索命令,当然在这之前,你需要使用其他方法设置你的查询条件什么的。
index方法就是用来发起CURL的重建索引命令,把这个方法放在crontab 定时任务里,就可以定时重建索引,我这里是全量重建索引,如果你的数据量很大,对新内容的搜索时效性也要求很高,那么可以使用增量索引,怎么做呢?看下管理界面,操作一下,然后调试模式抓取发出的请求连接,简单吧。
结束:
至此,就可以完成一个企业级的搜索服务了,下面贴上我给前端写的一个搜索接口,仅供参考!
public function actionSearch(){
$input = $this->getParam('input');
$page = $this->getParam('page')-1;
empty($page)&&$page=0;
$pageLength=200;
$page<0&&$page=0;
$startRow = $page*$pageLength;
$params=['content_txt'=>$input,'title'=>$input];
$solr = new SolrClient('crm');
$solr->setQuery($params);
$solr->setRows($startRow,$pageLength);
$solr->setFl(['id','title','create_time','content','content_txt','keyword','description','sid','mask_status','type','article_type','item_type','sequence']);
$solr->setHighLight(['title','content_txt'],"<b style='color: #f15353;'>","</b>");
$data = $solr->search();
$response=&$data['response'];
$highlighting=&$data['highlighting'];
$docs = &$response['docs'];
empty($docs) && $this->jsonReturn(0,'搜索成功',['totalpage'=>0,'totalcount'=>0,'pagesize'=>$pageLength, 'list'=>[]]);
foreach ($docs as &$doc) {
$id = $doc['id'];
$hlItem = $highlighting[$id];
$doc['content']=mb_substr($doc['content_txt'],0,200);
if(!empty($hlItem)){
if(!empty($hlItem['title'])){
if(!empty($hlItem['title'][0])){
$doc['title']=$hlItem['title'][0];
}
}
if(!empty($hlItem['content_txt'])){
if(!empty($hlItem['content_txt'][0])){
$doc['content']=$hlItem['content_txt'][0];
}
}
}
unset($doc['content_txt']);
}
$res=[
'totalpage'=>ceil($response['numFound']/$pageLength),
'totalcount'=>$response['numFound'],
'pagesize'=>$pageLength,
'list'=>$response['docs'],
];
$this->jsonReturn(0,'搜索成功。',$res);
}
然后附上一个简单粗糙的demo页面
PHP-从零开始使用Solr搜索引擎服务(下)的更多相关文章
- PHP-从零开始使用Solr搜索引擎服务(上)
前言: 原文地址: http://www.cnblogs.com/JimmyBright/p/7156069.html 使用搜索引擎,我们常规的数据查询会快很多,还可以对关键词进行中文分词查询,返回一 ...
- Linux 使用 docker 下搭建xunsearch 搜索引擎服务
Linux 使用 docker 下搭建 xunsearch 搜索引擎服务 安装 docker 环境(菜鸟教程有说明) 安装docker说明 下载并运行 xunsearch 的服务端:docker安装x ...
- Lucene/Solr搜索引擎开发笔记 - 第1章 Solr安装与部署(Jetty篇)
一.为何开博客写<Lucene/Solr搜索引擎开发笔记> 本人毕业于2011年,2011-2014的三年时间里,在深圳前50强企业工作,从事工业控制领域的机器视觉方向,主要使用语言为C/ ...
- Solr搜索引擎搭建详细过程
1 什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中 ...
- Solr搜索引擎服务器学习笔记
Solr简介 采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能 ...
- Lucene/Solr搜索引擎开发笔记 - 第2章 Solr安装与部署(Tomcat篇)
一.安装环境 图1-1 Tomcat和Solr的版本 我本机目前使用的Java版本为JDK 1.8,因为Solr 4.9要求Java版本为1.7+,请注意. 二.Solr部署到Tomcat流程 图1- ...
- solr 在windows下的安装
安装环境 Windows 7 64bit Apache-tomcat-8.0.9-windows-x64 Solr-4.9.0 JDK 1.8.0_05 64bit 安装步骤 Tomcat和JDk的安 ...
- Solr04 - 在Jetty和Tomcat上部署Solr单机服务
目录 1 准备安装环境 2 通过内部Jetty服务器启动 3 通过配置Tomcat服务器启动 3.1 删除不需要的应用 3.2 修改服务端口 3.3 部署solr.war 3.4 扩展: 虚拟目录发布 ...
- Solr搜索引擎 — 通过mysql配置数据源
一,准备数据库数据表结构 CREATE TABLE `app` ( `id` int(11) NOT NULL AUTO_INCREMENT, `app_name` varchar(255) NOT ...
随机推荐
- charles抓包https/模拟弱网/设置断点重定向/压测
charles几个常用功能 1,ios 抓包https网页:(如未配置,会显示unknown) 第一步是:给手机安装SSL证书 手机和电脑在同一wifi下,手机wifi配置http代理,ip是电脑 ...
- Appium安卓与环境配置
下载与安装: Appium-desktop项目地址:https://github.com/appium/appium-desktop 下载地址:https://github.com/appium/ap ...
- Myeclipse提高运行速度的方法
下文是在其他博客拷过来的,借鉴借鉴,留个笔记,哈哈 1.老是弹出Quick update error .关闭myeclipse的Quick Update自动更新功能这个问题的解决办法是关闭自动更新Wi ...
- Django中settings设计模式(单例模式)
配置文件: 需求:配置文件,默认配置和手动配置分开,参考django的配置文件方案,默认配置文件放在项目容器内部,只让用户做常用配置. /bin/settings.py(手动配置) PLUGIN_IT ...
- GitHub笔记(五)——忽略文件、配置别名、搭建服务器
六.忽略文件 忽略某些文件时,需要编写.gitignore: .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理! 忽略文件的原则是: 忽略操作系统自动生成的文件,比 ...
- docker 安装vim
执行以下命令 apt-get update apt-get install vim
- Influxdb配置文件详解---influxdb.conf
官方介绍:https://docs.influxdata.com/influxdb/v1.2/administration/config/ 全局配置 1 2 reporting-disabled = ...
- Tomcat分析
最近闲来无事,总结了一下tomcat的一些知识,分享出来供大家参考,如有错误,请及时与我联系. 1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置 ...
- Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法
#1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...
- UIWebView控件中 字体大小和字体样式的修改
修改UIWebView控件中字体的样式: NSString *htmlString = [NSString stringWithContentsOfFile:self.webPath encoding ...