知识点
相关文章
更多最近更新
更多solr安装以及php调用
2019-03-27 01:19|来源: 网路
背景:项目中需要将原有的sphinx搜索引擎换成solr,以下是通过参照网络内容后,从搭建到调用的一次整理。
资源:http://blog.csdn.net/lynnlovemin/article/details/12103343 solr部署到服务器tomcat中(服务器上的jdk和tomcat已经配置好)
http://www.php.net/manual/zh/class.solrquery.php solr扩展方式调用参照
http://wiki.apache.org/solr/CommonQueryParameters#q solr客户端代码调用参照
https://code.google.com/p/solr-php-client/downloads/list solr客户端调用需要下载的文件包地址
http://www.solr.cc/blog/ solr中国社区 官方QQ群:187670960
一.在服务器上将solr部署到tomcat中
主要步骤如下:
1、下载solr-4.4.0.tgz
2、解压缩solr-4.4.0.tgz,命令tar -xzvf solr-4.4.0.tgz
3、压缩后进入到solr-4.4.0目录,将 example/ webapps目录下的solr.war复制到tomcat的webapps目录中,
4、启动tomcat服务器,这时候会报错,不用管它,war会自动解压缩
5、在tomcat的bin里面新建一个solr目录
6、继续到solr-4.4.0目录,将example/solr目录下的collection1目录和solr.xml复制到tomcat的bin目录下的solr目录
7、将example/lib/ext/下的所有jar包复制到tomcat/webapps/solr/WEB-INF的lib目录中
8、在tomcat/webapps/solr/WEB-INF/下新建一个classes目录,将example/resources下的文件复制到该classes目录中
9、修改web.xml文件,为:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/home/liyi/solrtomcat/bin/solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
10、再次启动tomcat,浏览器输入:http://localhost:8080/solr就能看到solr的管理界面了。
二.php客户端调用服务器solr和通过安装solr的php扩展调用服务器solr的代码coding
1、首先将要用到的solr-php-client下载下来,放入到自己的php文件中(需要用到扩展方式还需装好扩展)
2、开始coding自己的代码,期间需要用的查询q,过滤fq,排序sort等参数说明可以见上面的资源
3、自己的php代码如下(已验证可用,代码包含了两种调用方式。代码有点长初版本没怎么优化,可以根据自己的需要ctrl+c后删除不需要的部分)
<?php require_once( ROOT_PATH.'/includes/Solr/Service.php'); class SolrSearch{ const SOLR_HOST = '172.18.107.96'; const SOLR_PORT = '8888'; const SOLR_URL = 'solr'; /** * php通过solr文件包连接服务器端 */ public static function solr_server(){ $solrSearcher = new Apache_Solr_Service( self::SOLR_HOST, self::SOLR_PORT, self::SOLR_URL ); if ( ! $solrSearcher->ping() ) { echo 'Solr service not responding.'; exit; } return $solrSearcher; } /** * php通过solr扩展连接服务器端 */ public static function extention_solr_server() { $extention_solrconfig=array('hostname' => self::SOLR_HOST,'port'=>self::SOLR_PORT); try { $solrSearcher = new SolrClient($extention_solrconfig); $solrSearcher->ping(); //需要,不调用ping()的时候如果服务器连接不上不会抛异常 } catch (Exception $e) { echo "Solr extention service connect fail."; exit; } return $solrSearcher; } /** * php文件包方式查询方法 */ public static function solr_query($query,$pageinfo=array('offset'=>0,'limit'=>600), $params=array('fl'=>'','fq'=>array())){ $solrSearcher=self::solr_server(); $params['fl']=$params['fl']?$params['fl'].",score":"*,score"; $response = $solrSearcher->search( $query , $pageinfo['offset'], $pageinfo['limit'] ,$params); $result=array(); $found_num=0; $http_status=$response->getHttpStatus(); if ( $http_status == 200 ) { $response_result=$response->response; $found_num=$response_result->numFound; if ( $found_num > 0 ) { $search_docs=$response_result->docs; $highlighting=$response->highlighting; foreach ($search_docs as $s_k=>$s_v){ $lists=get_object_vars($s_v->getIterator()); $lists['goods_color_name']=empty($highlighting->$lists['goods_id']->goods_name[0]) ? $lists['goods_name'] : $highlighting->$lists['goods_id']->goods_name[0]; $result['lists'][]=$lists; } } $result['total']=$found_num; $result['goods_status']=array(); $result['total_found']=$found_num; } else { echo $response->getHttpStatusMessage(); } return $result; } /** * 获取关键字分词后形成的词 */ public static function getWords($keyword) { $keyword = trim($keyword); $words = array(); if ($keyword) { $wordsInfo = self::getWordsInfo($keyword); if (is_array($wordsInfo) && !empty($wordsInfo)) { foreach ($wordsInfo as $val) { $words[] = $val['text']; } } } return $words; } /** * 获取关键字分词后的信息 */ public static function getWordsInfo($keyword) { $keyword = urlencode($keyword); // 拼接 调用分词接口的url $url = "http://172.18.107.96:8888/solr/collection1/analysis/field?wt=json&analysis.showmatch=true&analysis.fieldvalue=".$keyword."&analysis.fieldname=MaxWord&_=".time(); $i = 0; // 记录查询失败的次数 $code = 0; // 记录查询状态 $responseStr = ""; // 接口返回json字符串 while($code == 0 && $i < 5) //查询失败重试 { $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_TIMEOUT,10); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $responseStr = curl_exec($ch); $code = curl_getinfo($ch,CURLINFO_HTTP_CODE); $i += $code ? 0 : 1; //失败则查询次数加1 curl_close($ch); } // 解析接口返回的字符串 获取分词信息以数组形式保存 if ($responseStr) { $responseArr = json_decode($responseStr,true); if (isset($responseArr['analysis']['field_names']['MaxWord']['index'])) { return $responseArr['analysis']['field_names']['MaxWord']['index'][1]; } } return array(); } /** * 将收集到查询条件转换成solr要用到的信息 进行solr搜索 */ public static function find($conditions = array()) { // 定义存储 solr应用中q查询操作信息 $q = "goods_name:红色帽子 OR price:30";(对象包含关键字,一二级分类,属性) $q = ""; if (empty($_GET['keyword'])) { $q .= "goods_name:*"; } else { $q .= "goods_name:".$_GET['keyword']; } // 拼接分类条件信息 if (!empty($conditions['select'])) { if ($conditions['select'] == 1) { $q .= " AND cate_id_1:".$conditions['filter']['cate_id_1'][0]; } else if ($conditions['select'] == 2) { $q .= " AND cate_id_2:".$conditions['filter']['cate_id_2'][0]; } } // 拼接属性条件信息 if (!empty($_GET['g'])) // [g] => 2966_15449-2961_3007 { $attr_id_arr = explode('-', $_GET['g']); foreach ($attr_id_arr as $val) { $arr = explode('_', $val); $q .= " AND attr_id:*".$arr[1]."*"; } } // 判断扩展方式是否可用,决定调用的方式 if (class_exists('SolrClient')) // 通过solr的php扩展方式进行solr的连接处理 { $client = self::extention_solr_server(); $query = new SolrQuery(); // 设置sorl查询的q信息 //$query->setQuery('goods_name:红色帽子'); $query->setQuery($q); // 设置获取结果的起始位置 $query->setStart(0); // 设置获取结果的记录数 $query->setRows(600); // 类似分页的取出记录条数 // 设置排序信息SolrQuery::ORDER_ASC ,SolrQuery::ORDER_DESC //$query->addSortField("goods_id",SolrQuery::ORDER_DESC); // 设置sorl查询的fq信息 $fqInfo = self::getFqInfo($conditions,$query); if (!empty($fqInfo)) { $query = $fqInfo; } $queryResponse = $client->query($query); $response = $queryResponse->getResponse(); if ( $response->responseHeader->status == 0 ) { $response_result=$response->response; $found_num=$response_result->numFound; if ( $found_num > 0 ) { $search_docs=$response_result->docs; $highlighting=$response->highlighting; foreach ($search_docs as $s_k=>$s_v){ // $lists=get_object_vars($s_v->getIterator()); $lists=json_decode(json_encode($s_v),true); $lists['goods_color_name']=empty($highlighting->$lists['goods_id']->goods_name[0]) ? $lists['goods_name'] : $highlighting->$lists['goods_id']->goods_name[0]; $result['lists'][]=$lists; } } $result['total']=$found_num; $result['goods_status']=array(); $result['total_found']=$found_num; } else { echo $response->getHttpStatusMessage(); } $data = $result; } else // 通过solr的php文件包方式进行solr的连接处理 { // 定义存储 solr应用中排序sort,过滤查询fq,返回结果字段fl等信息 的数组 $params = array(); $params['fl'] = ""; //$params['sort'] = $conditions['order']; //权重分字段没有,暂时注释 $params['sort'] = "goods_id desc"; // 定义高亮显示参数(有关键字时将关键字高亮) if (!empty($_GET['keyword'])) { $params['hl'] = "true"; $params['hl.fl'] = "goods_name"; $params['hl.simple.pre'] = "<em class=\"highlight-keyword\">"; $params['hl.simple.post'] = "</em>"; } // 定义存储fq过滤信息数组,每个字段的条件设置作为数组$fq一个元素(包含) $fq = self::getFqInfo($conditions); if (!empty($fq)) { $params['fq'] = $fq; } // 用拼接好的参数调用solr查询 $data = self::solr_query($q,array('offset'=>0,'limit'=>600),$params); } // clear参数为7打印语句 if ($_GET['clear'] == 7) { echo "<pre>";print_r($data);exit; } // 将关键字信息存入data数据中 $data['words']=self::getWords($_GET['keyword']); return $data; } /** * * 依照前台处理后的条件数据转换成solr查询应用的过滤fq信息 * $query object 区别当前是以php文件包的方式还是扩展的方式调用solr(默认是php文件包方式,$query不为null则是扩展方式) * @param array $conditions */ private static function getFqInfo($conditions,$query=null) { // 定义前台传递参数与solr应用参数之间的key对应关系(其中数组key为前台key,数组val为solr应用key) $solr_key=array( 'price'=>'price', // 价格 'return_goods_status'=>'return_goods_status', // 48小时包退包换 'if_free_shipping'=>'if_free_shipping', // 免运费字段 'if_new_goods'=>'if_new_goods', // 新品 'real_shot'=>'real_shot', // 实拍 'is_enterprise'=>'is_enterprise', // 企业身份认证 'is_entity'=>'is_entity', // 实体认证 'is_behalfof'=>'is_behalfof', // 一件代发 'is_specialmem_status'=>'is_specialmem_status', // 免费看样 'is_promise'=>'is_promise', // 店铺等级 //'minbuy'=>'minbuy', // 起批数量 //'minbuyprice'=>'minbuyprice', // 起批价格 ); // 定义通过solr的php文件包形式调用solr服务器时fq信息存储数组 $fq = array(); // 当前台页面传递过来的参数中包含过滤条件时,依照不同的调用方式解析成solr应用的过滤fq信息 if (!empty($conditions['filter'])) { foreach ($conditions['filter'] as $key=>$val) { $fq_info_str = ""; if (array_key_exists($key, $solr_key)) { if ($key == "price") { $minPrice = strval(empty($val['min']) ? 0 : $val['min']); $maxPrice = strval(empty($val['max']) ? "*" : $val['max']); $fq_info_str = "price:[".$minPrice." TO ".$maxPrice."]"; } else { if (is_array($val)) { $fq_info_str = $solr_key[$key].":".$val[0]; } else { $fq_info_str = $solr_key.":".$val[0]; } } } /* $query不为null时,此时通过solr的php扩展方式调用solr服务器,fq信息通过$query->addFilterQuery("price:30");添加 * $query为null时,此时通过solr的php文件包调用solr服务器,fq信息通过$fq[] = "price:30";添加 */ if ($fq_info_str != "") { if ($query != null) { $query->addFilterQuery($fq_info_str); } else { $fq[] = $fq_info_str; } } } // 依照调用方式的不同返回不同的值 if ($query != null) { return $query; } else { return $fq; } } else { return ; } } }三.php的solr扩展安装
1.安装扩展前,先安装libxml2(可以谷歌下安装过程)。安装过程中在make的时候有时候会报错,这时候可以运行下make clean命令就可以了,详细的见http://www.cnblogs.com/wanhl/archive/2013/03/19/2969758.html
2.安装扩展内容(下面内容)可以查看:http://www.cnblogs.com/AndreMouche/archive/2011/07/31/2122872.html
./configure --with-php-config=/usr/local/php5/bin/php-config
sudo make
sudo make test
sudo make install
安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/
把这个记住,然后修改php.ini(vim /usr/local/etc/php.ini ),把
extension_dir = "./"
修改为
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"
extension=solr.so
转自:http://blog.csdn.net/cdy102688/article/details/15500857
相关问答
更多-
windows下怎么安装solr的php扩展[2022-03-27]
1、安装libssh2扩展 带dll的就是windows用的。 根据自己的环境选择安装包。 这里选择的是5.5 Thread Safe (TS) x64 解压完后,会有三个文件,libssh2.dll、php_ssh.dll、php_ssh2.pdb。 将 php_ssh.dll、php_ssh2.pdb 放到你的 php 扩展目录下 php/ext/ 下。 将libssh2.dll 复制到 c:/windows/system32 和 c:/windows/syswow64 各一份 php.ini中加入 e ... -
linux 下solr不安装扩展php可以调用吗[2022-02-01]
一. 安装 1. 下载扩展包 从 Pecl::Package::Solr 下载最新稳定版扩展包并解包 2. 安装基础库 安装 libcurl devel 文件: sudo apt-get install libcurl4-gnutls-dev 安装 libxml2 devel 文件: sudo apt-get install libxml2-dev 3. 编译安装扩展 phpize ./configure make sudo make install 4. 添加PHP 扩展配置 extension=solr ... -
怎么测试 php5.5 安装solr扩展成功[2022-02-24]
1、安装libssh2扩展 带dll的就是windows用的。 根据自己的环境选择安装包。 这里选择的是5.5 Thread Safe (TS) x64 解压完后,会有三个文件,libssh2.dll、php_ssh.dll、php_ssh2.pdb。 将 php_ssh.dll、php_ssh2.pdb 放到你的 php 扩展目录下 php/ext/ 下。 将libssh2.dll 复制到 c:/windows/system32 和 c:/windows/syswow64 各一份 php.ini中加入 e ... -
如果您尝试自行下载存档,则需要安装phpize。 如果您安装了phpize ,请手动执行此操作: pecl download solr-beta tar xvzf solr-2.0.0.tgz cd solr-2.0.0 phpize ./configure make sudo make install # add extension=solr.so to your php.ini / distribution extension loader ..这应该与pecl install solr-beta , ...
-
如何在Solr 4中安装JTS?(How to install JTS in Solr 4?)[2023-09-23]
如果您在Ubuntu服务器上的Tomcat中运行Solr,并且已经将Solr WAR部署到/webapps文件夹 /webapps 。 然后,根据Solr Wiki上的Lucene / Solr 4 Spatial文档,您只需将JTS distribution /lib文件夹中的所有jar文件复制到运行Solr的WEB-INF/lib文件夹。 更新 由于您使用Jetty运行Solr,因此您需要将JTS jar文件的位置包含为类路径。 基于Clas ... -
jquery的php访问solr?(php of jquery to access solr?)[2024-04-05]
使用PHP(或另一种服务器端语言)实现基本功能。 使用客户端JS的可选附加组件。 建立在有效的东西上。 Use PHP (or another server side language) for essential functionality. Use client side JS for optional extras. Build on stuff that works. -
当您以Solr用户身份运行时,必须让solr用户访问您要编写配置的目录。 如果这是/opt/solr ,则可以通过发出chown命令递归地更改目录的所有者和所有包含的文件: chown -R solr.solr /opt/solr 这假设您的系统上还有一个名为solr的组。 如果您没有solr组,请使用另一个合适的组,或将最后一个.solr保留在命令之外。 When you're running as the Solr user, you'll have to give the solr user acc ...
-
/usr/bin/java 很可能是一个象征性的联系。 ls -l /usr/bin/java 将告诉你它目前指向的是什么。 如果需要更新,请使用以下命令: ln -sfn
/usr/bin/java 更新符号链接并尝试重新安装。 /usr/bin/java is most likely a symbolic link. ls -l /usr/bin/java will show you what it is currently pointing to. If ... -
需要SOLR和PHP帮助(SOLR and PHP help needed)[2023-04-16]
这里有一篇很好的文章将帮助您完成PHP和SOLR的集成: http://www.ibm.com/developerworks/opensource/library/os-php-apachesolr/ SOLR有许多PHP接口,该文章引用了PHP SOLR客户端: http://code.google.com/p/solr-php-client/ 但也有这个: http://pecl.php.net/package/solr There's a good article here that will hel ... -
首先来看看本教程 。 使用solr,您将需要一个xml(或csv )文档,该文档将被推送到solr(进程称为更新;索引是使字段可用于搜索的过程)。 ......的格式是...... 喜欢:
9885A004 Canon PowerShot SD500 camera