thinkphp3.2整合使用solr

参考文章:

  1. https://www.cnblogs.com/zihai/p/7311412.html
  2. 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
  3. 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
  1. 安装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管理客户端。

image.png

  1. 查看solr范例

先停止solr实例

bin\solr.cmd stop all  //关闭所有
或者
bin\solr.cmd stop 8983  //指定端口号

再启用solr范例

bin\solr.cmd -e techproducts

打开web管理客户端:http://localhost:8983/solr/,查看结果

image.png

根据结果,可知道,techproducts范例中共有32篇文章。

现在可以尝试他的查询功能。
我在q输入框中输入了Samsung,其得到的结果如下图


image.png
  1. 添加文档
image
image

添加好后,进入查询界面,看能否查到这篇文档

image
  1. 删除文档
image

返回查询界面,查询删除后的结果

image
  1. 创建solr项目

现在学会一些基本的操作,可以自己创建一个项目录了。

先把停止solr
solr.cmd stop -all
solr是一个实例可以有多个core或collection,如果不先停止,创建的core将会添加到启用的techproducts实例中
solr.cmd create -c test

image.png

重新刷新web客户端

image
  1. 下载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
  1. 在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

image.png

  1. tp3.2中代码

Org/Util中新建SolrClient.class.php 用于查询


image.png
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的 控制器 包含增删改查

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'],"","");
        //最终查询
        $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;
         
    }
}

你可能感兴趣的:(thinkphp3.2整合使用solr)