美文网首页
thinkphp3.2整合使用solr

thinkphp3.2整合使用solr

作者: geeooooz | 来源:发表于2021-09-01 15:36 被阅读0次

    参考文章:

    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
    <?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;
             
        }
    }
    

    相关文章

      网友评论

          本文标题:thinkphp3.2整合使用solr

          本文链接:https://www.haomeiwen.com/subject/gaixwltx.html