参考文章:
- https://www.cnblogs.com/zihai/p/7311412.html
- https://blog.csdn.net/weixin_38730732/article/details/81359984?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
-
https://www.cnblogs.com/JimmyBright/p/7156085.html
4.https://blog.csdn.net/ailihui366/article/details/102745117
5.https://blog.csdn.net/qq_39454048/article/details/102581140
仅测试在windows本地使用 我的环境是wamp
- 安装solr
下载solr,选择相应版本,注意:因为solr对是基于java的,所以必需安装jre。每个版本的 solr对jre版本要求不一样,下载时请注意solr的版本。
我的java版本是:"1.8.0_181"
我用的是solr6.6.0 下载地址 http://archive.apache.org/dist/lucene/solr/6.6.0/
将压缩包解压到任意目录 win+R cmd进入命令行模式 cd到solr6.6.0中
启动solr
运行命令: bin\solr.cmd start
image.png
solr默认监听的是8983端口
更多命令用法,请使用solr -help,如果solr已经启动,请使用solr start -help。
如果启动成功,可以在浏览器中打开:http://localhost:8983/solr/,使用其web管理客户端。
- 查看solr范例
先停止solr实例
bin\solr.cmd stop all //关闭所有
或者
bin\solr.cmd stop 8983 //指定端口号
再启用solr范例
bin\solr.cmd -e techproducts
打开web管理客户端:http://localhost:8983/solr/,查看结果
根据结果,可知道,techproducts范例中共有32篇文章。
现在可以尝试他的查询功能。
我在q输入框中输入了Samsung,其得到的结果如下图
image.png
image image
- 添加文档
添加好后,进入查询界面,看能否查到这篇文档
imageimage
- 删除文档
返回查询界面,查询删除后的结果
image
- 创建solr项目
现在学会一些基本的操作,可以自己创建一个项目录了。
先把停止solr
solr.cmd stop -all
solr是一个实例可以有多个core或collection,如果不先停止,创建的core将会添加到启用的techproducts实例中
solr.cmd create -c test
重新刷新web客户端
image
- 下载php的solr扩展
现在开始使用php和solr交互了,所以必需安装solr扩展。
分两步:
1.安装libssh2扩展
浏览器打开当前php,效果如下图所示,查找对应位置信息
image.png
如上图所示,查看当前VC版本, TS还是NTS(线程安全还是非安全),以及X86还是X64。
然后进入网站,查找对应版本http://windows.php.net/downloads/pecl/releases/ssh2/0.12/
由于当前环境事 X64,TS, VC11,所以我们选择下面连接下载
image.png
下载后解压,
安装
将 php_ssh2.dll、php_ssh2.pdb 放到你的 php 扩展目录下 php/ext/ 下。
将libssh2.dll 复制到 c:/windows/system32 和 c:/windows/syswow64 (64位系统才有)各一份
php.ini中加入 extension=php_ssh2.dll
检查安装
浏览器打开刚才的网址,查看phpinfo,可以看到安装成功
image.png
2.安装solr扩展
下载地址:http://windows.php.net/downloads/pecl/releases/solr/;
将压缩包的php_solr.dll、php_solr.pdb 放到你的 php 扩展目录下 php/ext/ 下。
php.ini中加入 extension=php_solr.dll
重启服务器,查看phpinfo(),是否有显示solr扩展加载成功。
安装之前需使用phpinfo()查看自己版本信息、下载相匹配的扩展
下载扩展时注意 ts或者是nts
image.png
- 在thinkphp3.2中集成solr
composr 安装不表
由于php版本低直接 composr require solarium/solarium
失败
所以直接在新目录创建composer.json文件
{
"require": {
"solarium/solarium": "^3.8"
}
}
然后进入到项目根目录下 cmd执行 composr require solarium/solarium
如不成功 可尝试 composer install/update
image.png
image.png
- tp3.2中代码
Org/Util中新建SolrClient.class.php 用于查询
image.png
<?php
namespace Org\Util;
/**
* @Description: 操作solr
* @Date:2012.9.1
* @Version:v1
* @Author:wujiawei
*/
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 = 'lgbv3';
$host='localhost:8983';
$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($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($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);
}
}
使用solr的 控制器 包含增删改查
<?php
namespace Demo\Controller;
use Think\Controller;
use Solarium\Client;
header('Content-Type:text/html;charset=utf-8');
class IndexController extends Controller{
public function actionSearch(){
$input = I('input');//查询的文字
$page = I('page')-1;//页数
empty($page)&&$page=0;
$pageLength=10;//默认条数
$page<0&&$page=0;
$startRow = $page*$pageLength;
$params=explode(",",$input);
//调用示例
//实例化
$solr = new\Org\Util\SolrClient();
//设置查询文字
$solr->setQuery($params);
//$startRow页数 $pageLength条数
$solr->setRows($startRow,$pageLength);
//getField 只拿这些字段
$solr->setFl(['id','name','third_cat_name','attributes','cover_image']);
//高亮突出
$solr->setHighLight(['name','third_cat_name'],"<b style='color: #f15353;'>","</b>");
//最终查询
$data = $solr->search();
$response=&$data['response'];
$docs = &$response['docs'];
dump($docs);die;
}
/**
* 增加索引/更新索引(根据所传id是否已经存在,存在则更新,否则新增)
* @return \Illuminate\Support\Collection
*/
public function updateSearchProduct(){
$options = [
'endpoint' => [
'localhost' => [
'host' => '127.0.0.1', //IP地址
'port' => 8983, //端口号
'core' => null,
'path' => '/solr/lgbv3',
'wt'=>'json',
],
],
];
$client = new Client($options);
$data=array(
"id"=>"15340",
"sid"=>9867,
"shop_id"=>41,
"second_cat_name"=>"摄像机",
"first_cat_name"=>"视频监控",
"price"=>380.0,
"name"=>"海康威视POE供电网络监控摄像头",
"third_cat_name"=>"网络高清摄像机",
"attributes"=>"3:机型,12:枪型;4:分辨率,27:500万像素;5:供电,33:DC12V;6:红外夜视,40:30米;9:外壳,98:铝合金",
"cover_image"=>"http://xxxx.com/upload/image/19480/qp3z5ujfw2nxy4mtclhg1533605053.jpg",
"brand"=>"海康威视",
);
$update=$client->createUpdate($data);
$doc=$update->createDocument();
foreach ($data as $key=>$value){
$doc->$key=$value;
}
$update->addDocument($doc);
$update->addCommit();
$updateResponse=$client->update($update);
$res = $updateResponse->getResponse();
dump($res);die;
}
/**
* 删除索引
*/
public function delete() {
$id='EN70906025';
//solr数据库配置
$options = [
'endpoint' => [
'localhost' => [
'host' => '127.0.0.1', //IP地址
'port' => 8983, //端口号
'core' => null,
'path' => '/solr/lgbv3',//solr 索引库位置
'wt'=>'json',
],
],
];
$client = new Client($options);//实例化 solr类
$update = $client->createUpdate();
$update->addDeleteById($id);//通过id
$update->addCommit();
$result = $client->update($update);
$res = $result->getResponse();
$a = $res->getStatusCode();
dump($a);
dump($res);die;
}
}
网友评论